Why +/ *: a works, but when I say foo =: +/ *:, foo a doesn't work?
+/ *: 1 2 3 14
but when you make a verb to do the operation, you get
foo =: +/ *: foo 1 2 3 2 5 10 3 6 11 4 7 12
The complete story is a bit intricate, but you can get along quite well to begin with by imagining that the name of a verb is replaced by its value enclosed in parentheses. This is similar to mathematics, where if you want to substitute into you have to write rather than .
So, when you used your foo, it was as if you had written (+/ *) 1 2 3 which would give you:
(+/ *:) 1 2 3 2 5 10 3 6 11 4 7 12
We needn't concern ourselves with what (+/ *:) does (it's called a hook); all we need to know now is that it's not the same as +/ *: without the parentheses.
Correct ways to write foo are:
foo =: 3 : '+/ *: y' foo =: 13 : '+/ *: y' foo =: verb : '+/ *: y' foo =: +/@:*: foo =: [: +/ *:
It should be noted that the notion that a verb is replaced by its parenthesized value is fundamentally incorrect. That is just a way of thinking about the execution of a sentence that gets the correct result in normal cases. The actual processing is different, as described in the references.
Contributed by HenryRich