What is the syntax for a vector (array) of functions in APL?
I have tried the following but these are interpreted as a 3-train and a 2-train, respectively:
{1},{2}
{1} {2}
PS. I am looking to do this with more complex (and possibly named) functions by the way, the {1}
above is just so the example is short.
APL programmers often assign informal names when discussing functions and operators (for example, product for ×/) but the core functions and operators provided by the language are denoted by non-textual symbols. Most symbols denote functions or operators.
APL programmers often assign informal names when discussing functions and operators (for example, product for ×/) but the core functions and operators provided by the language are denoted by non-textual symbols. Most symbols denote functions or operators. A monadic function takes as its argument the result of evaluating everything to its right.
Built-in APL functions (or 'primitive' functions) are denoted by symbols (such as +-÷×). Primitive functions can be either monadic(which means they take a single right argument), or dyadic(in which case they take an argument on the left and an argument on the right). The same symbol may have both monadic and dyadic forms. Execution order
A line of APL may consist of several functions, and arguments. There are therefore two points you must bear in mind: Expressions are evaluated from right to left. The results of one function become the argument of the next function. This simple example illustrates both of these points: 50×2-150
Arrays of functions can be obtained using ⎕OR
(Object Representation) and the fact that such objects implicitly become reconstituted into functions when used as operands. (You can also do it explicitly using ⎕FX
.) It is easiest to define some helper operators first:
_Arrayify←{f←⍺⍺ ⋄ ⎕OR'f'}
_Apply←{2=⎕NC'⍺':⍺ ⍺⍺ ⍵ ⋄ ⍺⍺ ⍵}
Now, let's define some sample functions:
A←{2×⍵}
B←{⍵÷2}
C←{-⍵}
We create a 3-element vector of functions, and check that it is indeed a "normal" array:
fnArray←(A _Arrayify⍬)(B _Arrayify⍬)(C _Arrayify⍬)
⍴fnArray
3
Let's extract the second function and apply it:
(2⊃fnArray)_Apply 10
5
We can also create an application function, so we can use operators on it:
Apply←{⍺ _Apply ⍵}
fnArray Apply¨10
20 5 ¯10
Dyalog APL does not officially support function arrays, you can awkwardly emulate them by creating an array of namespaces with identically named functions.
(a←⎕NS⍬).f←2∘×
(b←⎕NS⍬).f←÷∘2
(c←⎕NS⍬).f←-
f←(a b c).f
f 4
8 2 ¯4
Maria Wells suggested an operator to produce an array of functions
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With