Misplaced dataization

The cache of a ! lives in the formation that holds it. When a nested formation dataizes an object of the formation around it, every copy of the nested formation starts with an empty cache and dataizes the same object again. A recursive formation makes a new copy on every step, so the delimiter below is dataized once per step, though it never changes:

[^ items] > joined
  [^ acc tup] >> with-delimiter
    if. > @
      tup.length.eq 0
      acc
      ^.with-delimiter
        concat.
          concat. (dataized tup.head) ^.^!
          acc
        tup.tail

The lint warns when two things hold. First, the target of a ! or of a dataized is a plain chain of attribute reads that goes through ^. Second, the formation that holds it sits inside another formation of the same file. Move the dataization up into the enclosing formation, where it runs once per call:

[^ items] > joined
  ^ >> delimiter!
  [^ acc tup] >> with-delimiter
    if. > @
      tup.length.eq 0
      acc
      ^.with-delimiter
        concat.
          concat. (dataized tup.head) ^.delimiter
          acc
        tup.tail

The lint stays silent on an application, such as ^.sys.accept >>! with its arguments, because a syscall must run on every call, and moving it up would run it only once. It also stays silent on a global, such as eol!, on a top-level formation, whose enclosing object lives in another file, and inside a test.

Published on Fri Oct 2 12:30:32 UTC 2026.