FENCE!'s Higher Calling: WRAP

There's a little bit of an issue with using WRAP on things like loop bodies that are taken by value, because they may or may not run.

 data: []

 for-each 'item data {
     var: ...
     ...
 }

If the behavior of FENCE! is to wrap and create an object, and bind the list to it and give it back as a BLOCK!, you'd be creating an object even when you weren't going to need it... because there'd be no iteration.

Branching code handles this by using literal arguments.

It seems to me that for that reason, loops should follow branch rules, and take their bodies as literals... so that you only pay if the loop runs at least once.

It's good for FENCE!, and it's good for synthesized bodies via GROUP!:

 data: []

 code: '[item mold print]

 for-each 'item data (
     print "don't want to run this when data is empty"
     reverse code  ; would turn code to [print mold item]
 )

...and for that matter, it's arguably good even for plain old BLOCK! (because you're not gluing a binding into a block evaluating it, leaving that reference for the GC to clean up).

Anyway...loop bodies are basically branches, taken repeatedly.

So this is probably where things were going, anyway.