Riddle 2 Answer
This is somewhat esoteric, and I wouldn’t be surprised if very few people had any idea what I was even asking. I discovered this largely by chance, while fiddling around with function bytecode, though I think it could be deduced from observation without that.
So, the answer:
::
is usually taught as a sui generis operator, called “global amend”, which has the specific behavior (when used as a verb inside a function) of setting a global variable (instead of the local one that :
would set in the same place). No connection is typically drawn between it and any other operator (other than :
).
However, I’m pretty sure this is inaccurate. While obviously I don’t know for certain, I strongly suspect that there is no code anywhere in the q binary saying that ::
is defined as “global amend”. Rather, it is a specific case of the dyadic “f:
” pattern, where f
is some dyadic function—e.g. dyadic +:
, -:
, *:
, etc.
These all have the same behavior—x f:y
is defined as x:x f y
.
Additionally, when used inside functions on variables that have not been identified by the compiler as locals, they modify (and if necessary, create), global variables.
q){a:1;a+:1;a}[] 2 q)a 'a q){a+:1}[] q)a 1 q)
It follows that if f
is :
, then the operation involved is assignment, and so x
gets y
assigned to it, as a global variable if not identified as a local variable.
In fact, this can be seen in the same way:
q){a:1;a::2;a}[] 2 q)a 'a q){a::2}[] q)a 2 q)
Thus arises “global amend”.
If anything, the “create view” sense of ::
must be the special case, as ordinarily, dyadic f:
verbs behave identically inside and outside functions.
Labels: riddle, riddle answer, theory