In terms of making use of our parameter conventions, we could say that the $arg
convention means "evaluate at callsite and keep the binding", but an ordinary arg would not bring the binding along.
So if you used the $...
machine-control: func [$instruction [word!] [
print ["lookup of (" instruction ") is:" get instruction]
]
on: 1 off: 0
instructions: reduce [$on $off]
>> machine-control instructions.1
lookup of ( on ) is 1
But without the $...
machine-control: func [instruction [word!] [
print ["lookup of (" instruction ") is:" get instruction]
]
on: 1 off: 0
instructions: reduce [$on $off]
>> machine-control instructions.1
** Error: `on` word is not bound
Would Unbound By Default Be Too Annoying?
This is one of those decisions that's kind of like whether to make arguments const
by default or not. In that case, I feel pretty strongly that it helps to know when a function is going to mutate the thing you're passing it or not, and that a modern language should require you to say when things are mutable...not call out cases when they are const...if they happen to remember.
Both cases would definitely make the code noisier (and it's already developing a lot of symbolic noise by necessity...this isn't a necessity).
But since everything is configurable, perhaps having the core do the right thing...then let you rewrite the spec in your own FUNC version to make normal arg become $arg... that could be the way to go.