Since FENCE! came out I've been reluctant to use it directly in source as MAKE OBJECT!... wondering if there was some higher calling.
I suggested it might be better to have it be the CONSTRUCT dialect, for instance. And that seemed smarter:
>> {x y (1020) ~z~}
== &[object! [
x: ~null~
y: 1020
z: ~
]] ; ... maybe this is useful? :-/
But Then... I Looked at WRAP in Branches...
When I looked at that I thought "well, branches take their argument literally, WHY NOT USE FENCE! and have it mean WRAP?"
>> if 1 = 1 {x: 10 print [x]} else {x: 20 print [x]}
10
>> if 1 = 2 {x: 10 print [x]} else {x: 20 print [x]}
20
EUREKA
![]()
With these seen, I realized it wasn't just branches. The best... most cross-cutting application of the new FENCE! type under non-dialected evaluation... would be for wrapping code in contexts... and returning the wrapped BLOCK!:
>> {x: 10 print [x]}
== [x: 10 print [x]] ; bound (to a context with X in it!)
(Note that WRAP in Redbol lore has sometimes been evaluating and sometimes not...but the more useful form here is "make the block bound into the object, but don't run it, just return it.")
I don't think it will become the default code block choice. Because it gathers all the top-level SET-WORD!s and you have to be more careful, to use $foo: for any assignments you want to refer to outer-"scoped" things:
x: 10
y: 20
assert [1324 = all {
x: 1020
[$y]: 304 ; [$y]: today means "ignore Y as field of WRAP'd context"
set $y 304 ; alternative trick (more like historical trick)
(y: 304) ; yet another historical trick to dodge wrapping Y
x + y
}]
assert [x = 10, y = 304]
So don't expect to see people reaching for this every time they make a code block. Brackets will remain king, especially since LET gives you a nice-enough tool most of the time if you need to create a new variable in mid-block.
But this makes it more terse if you are doing an evaluation where you're creating more variables than you are assigning outside the scope.
FENCE Function Body: "Make Top-Level Assigns Locals"
foo: func [x y] {
local: 10
if x [
not-local: 20
...
]
...
}
Mechanically speaking, this requires FUNC body to be taken literally. But it can build the locals into the FRAME!, and use its knowledge of what's already in the frame so that it doesn't create locals for arguments...
We see that now you have the power you always needed... to make a choice of scope establishment at each level, since it makes little sense to make it deeply when you don't know what dialect might be in effect:
foo: func [x y] {
local: 10
if x {
new-variable: 20 ; not a FRAME! local, but new to this scope
x: 30 ; would be creating a new variable (vs. $x:)
...
}
y: 40 ; wouldn't create new variable? (FUNC got FENCE!, can filter)
...
}
There's a bit of nuance here with a difference between the logic of the outermost scope vs. the inner ones, but I think that nuance is learnable. (Don't like it? Don't use FENCE!, use BLOCK! and LET... and be a little wordier and less efficient. This just helps the efficiency-hounds have a pithier way of saying what they want.)
It's a really high-leverage choice, and I think it stands out visually well enough... especially when you are in the rhythm of expecting to see BLOCK!, making the choice all the more powerful.
{{...}} Probably Should Be Boring 
It's a little risky to carve something out of a generic evaluative tool to give {{...}} as some special meaning (CONSTRUCT, etc). Generative code might get bitten. It thinks it's inserting scoped code somewhere, which is also scoped, and you get a wacky composite behavior.
(Though ^{...} could be argued as a pretty cool way of asking for the OBJECT! that was generated by the WRAP, vs. the evaluative product. Will have to think about that.)
But there's a plus to having {{...}} and ((...)) being largely meaningless in the evaluator. Since you wouldn't have a good reason to write them as they do the same thing as {...} and (...) generally, they make good callouts for COMPOSE or similar to do templating/etc.
I think CONSTRUCT might just be CONSTRUCT, and then in some contexts you might use RebindableSyntax to say "the {...} or {{...}} I use here are constructs" (for instance, that's what it is in locals in function specs, probably other places...)
Sky's the limit here.