{name} ← ##.fix rep ⍝ Fix function/operator rep. Fixes the function or operator from its [rep]resentation. The name of the fixed function is returned as a shy result. Technical note: [fix] uses a technique suggested by Maurice Jordan for re-establishing the ⎕or of a function. It works as follows: Taking the ⎕or of a function is fast because it doesn't do anything! A _pointer_ to the function is marked as _value_, rather than _function_ in the parser's internal state. This causes a name assigned to the value to have a class of 2, rather than 3. Conversely, the ⎕fx of a ⎕or is fast because the parser merely marks the pointer as _function_. A D- (or traditionally defined) _operator_ may be given either an array or a function as operand. On receipt of an operand, the operator looks at the inter- nal structure of the value passed and allocates a name class accordingly. If the operator receives the ⎕or of a function as operand, it deduces that it has been passed a function and sets the class (of ⍺⍺, in the case of a d:op) to 3. Maurice's traditionally defined operator looked like this: ∇ Z←(QOR APPLY)A ⍝ Apply ⎕OR of function to A [1] Z←QOR A ∇ In the case of a derived function, [fix] passes the ⎕or as _operand_ and the [name] as _argument_, to an inner operator. Notice that as ⍺⍺ is quoted in the argument to ⍎ that is used to effect the assignment, a dummy, unvisited ⍺⍺ is placed on the following line. This is in order to force the enclosing {}s to be an operator and so receive the ⎕or as left operand, rather than left argument. fix←{ ⍝ Fix function/operator rep. ··· ⍺{ ⍝ ⎕or (operand to inner operator). ⍎⍵,'←⍺⍺ ···' ⍝ name derived/primitive/system function. ⍺⍺ ⍝ (dummy ⍺⍺ forces class). }⍵ ⍝ name for assignment. ··· } Example: vec ⍝ vector of function reps. ┌──────┬──────┬──────────┐ │ ∇tfn │ ∇dfn │┌───┬────┐│ │ │ ││afn│ ×/ ││ │ │ │└───┴────┘│ └──────┴──────┴─────────→┘ fix¨vec ⍝ fix functions. ⎕cr¨'afn' 'dfn' 'tfn' ⍝ function 'source'. ┌──┬─────────┬─────┐ │×/│dfn←{3↑⍵}│z←tfn│ │ │ │z←⎕TS│ └──┴─────────┴─────┘ afn dfn tfn ⍝ test functions. 600300 See also: rep Back to: contents Back to: Workspaces