User-Defined Functions/Operators/Hyperators
From NARS2000
- Within a user-defined function/operator header, the left and right arguments may consist of one or more names separated by one or more blanks and enclosed in parentheses. In this context, the caller of the function/operator must pass a scalar or an appropriate length vector argument, one element per name.
- For example, a function whose header looks like
- ∇ Z←FOO (R1 R2)
- can be called with a two-element vector (or a scalar which is extended to a two-element vector) right argument only. If the right argument is of rank greater than one, a RANK ERROR is signaled. If the right argument is not of the proper length, a LENGTH ERROR is signaled.
- Note that if only one name appears within parentheses in the left or right argument, vector arguments must be singletons.
- A user-defined function/operator header result may consist of two or more names separated by one or more blanks. In this context, when the function exits, the individual names must all have a value (else a VALUE ERROR is signaled), the names are joined together in a strand, and the resulting vector is returned as the result. If the header contains only name for the result, it may not be enclosed in parentheses.
- The result of a user-defined/operator may be marked as non-displayable by enclosing it in braces, as in ∇ {Z}←FOO R. If the result part of the header consists of multiple names, either ∇ {Z1 Z2}←FOO R, ∇ ({Z1 Z2})←FOO R, or ∇ {(Z1 Z2)}←FOO R may be used to mark the result as non-displayable.
- A user-defined function/operator may be called with an optional left argument (ambivalent) by enclosing the left argument in braces, as in ∇ Z←{L} FOO R. If the left argument part of the header consists of multiple names, either ∇ Z←{L1 L2} FOO R, ∇ Z←({L1 L2}) FOO R, or ∇ Z←{(L1 L2)} FOO R may be used to mark the left argument as optional. The system function ⎕NC may be used to detect the presence/absence of the left argument.
- The above features are an extension of the ones implemented by Dyalog APL.
- A user-defined operator is distinguished by its header that, in the place where the function name normally appears, contains a left operand name, an operator name, and an optional right operand name (for dyadic operators only), all enclosed in parentheses. For example, operator part of the header for a monadic operator looks like (LO OP1), and the same part for a dyadic operator looks like (LO OP2 RO). Both types of user-defined operators may be called monadically or dyadically, as in
Monadic derived function Dyadic derived function Monadic operator: ∇ Z←(LO OP1) R ∇ Z←L (LO OP1) R Dyadic operator: ∇ Z←(LO OP1 RO) R ∇ Z←L (LO OP1 RO) R
- Axis operator
consists of an optional, possibly non-displayable, possibly multiple name, result, an optional possibly multiple name left argument, a left operand, an operator name, an optional right operand, and a right argument.