(into xs (vec-new i32) (map double) (filter even?)). The function name is syntax and never a value, so (map double) is (double x) written into the loop body: no intermediate collection, no closure, no generics, nothing to inline. Transducers would compose at run time and Rust's iterators need monomorphisation; a macro needs neither. into.flan counts the pulls, which is the assertion a unit test cannot make. The destination is in the form because the destination is the allocation, and that is what makes spec-memory.md's explicit-allocator rule true by construction rather than by convention. Which also settles the open question: reductions do not share the form. A seed is not an allocation, so (into xs 0 (map cost) (sum)) would be a second form wearing the same spelling, and the destination would stop being honest about what it is. A source that is already a name is used as it is, not bound. A (Vec T) is move-only, so binding it would take the caller's ownership for something that only reads; a fixed array would be copied once per into. A source that is anything else is still bound once, which is what a call needs. The wart is that an owning temporary there leaks, because the binding has a name the caller cannot reach — a call in that position should borrow, and drop is what would close it. All four of the prelude's macro limits bit and none blocked anything. The three refusals are names nothing defines, which is the only error facility a macro has. into-wrap is a defn using only special forms, so Macro.reduce does not drop it, and it is the first thing in the prelude written as a loop/recur.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%