APL syntax and symbols
|
|
This article includes a list of references, related reading or external links, but its sources remain unclear because it lacks inline citations. Please improve this article by introducing more precise citations. (January 2010) |
The APL programming language is distinctive in being symbolic rather than lexical: its primitives are denoted by symbols, not words. These symbols were originally devised as a mathematical notation. APL programs often assign names to values or functions (for example, product ← ×/) but the core language is entirely symbolic.
Contents |
[edit] Monadic and dyadic functions
Most symbols denote functions. A monadic function takes as its argument the result of evaluating everything to its right. (Moderated in the usual way by parentheses.) A dyadic function has another argument, the first item of data on its left. Many symbols denote both monadic and dyadic functions, interpreted according to use. For example, ⌊3.2 gives 3, the largest integer not above the argument, and 3⌊2 gives 2, the lower of the two arguments.
[edit] Functions and operators
APL uses the term operator only in Heaviside’s sense of a moderator of a function. For example, the operator reduce is denoted by a forward slash and reduces an array along one axis by interposing its function operand. An example of reduce:
×/2 3 4
24
is equivalent to
2×3×4
24
In this case, the reduce operator moderates the multiply function. The expression ×/ evaluates to a monadic function that reduces an array by multiplication. (From a vector, it returns the product of its elements.)
[edit] Syntax rules
There is no precedence hierarchy for functions or operators.
The scope of a function determines its arguments. Functions have long right scope: that is, they take as right arguments everything to their right. A dyadic function has short left scope: it takes as its left arguments the first piece of data to its left. For example,
1 ÷ 2 ⌊ 3 × 4 - 5
¯0.3333333333
1 ÷ 2 ⌊ 3 × ¯1
¯0.3333333333
1 ÷ 2 ⌊ ¯3
¯0.3333333333
1 ÷ ¯3
¯0.3333333333
An operator may have function or data operands and evaluate to a dyadic or monadic function. Operators have long left scope. An operator takes as its left operand the longest function to its left. For example:
∘.=/⍳¨3 3
1 0 0
0 1 0
0 0 1
The left operand of the each operator ¨ is the index function. The derived function ⍳¨ is used monadically and takes as its right the vector 3 3. The left scope of each is terminated by the reduce operator, denoted by the forward slash. Its left operand is the function expression to its left: the outer product of the equals function. (The syntax and 2-glyph symbol of the outer-product operator are both unhappily anomalous.) The result of ∘.=/ is a monadic function. With a function’s usual long right scope, it takes as its right argument the result of ⍳¨3 3. Thus
(⍳3)(⍳3)
1 2 3 1 2 3
(⍳3)∘.=⍳3
1 0 0
0 1 0
0 0 1
⍳¨3 3
1 2 3 1 2 3
∘.=/⍳¨3 3
1 0 0
0 1 0
0 0 1
Some interpreters support the compose operator ∘ and the commute operator ⍨. The former "glues" functions together so that foo∘bar is a function that applies function foo to the result of function bar. Where a dyadic function is moderated by commute and then used monadically, its right argument is taken as its left argument as well. Thus a derived function to return an identity matrix:
im ← ∘.=⍨∘⍳
im 3
1 0 0
0 1 0
0 0 1
[edit] Monadic functions
| Name | Notation | Meaning | Unicode codepoint |
|---|---|---|---|
| Roll | ?B | One integer selected randomly from the first B integers | U+003F |
| Ceiling | ⌈B | Least integer greater than or equal to B | U+2308 |
| Floor | ⌊B | Greatest integer less than or equal to B | U+230A |
| Shape | ⍴B | Number of components in each dimension of B | U+2374 |
| Not | ∼B | Logical: ∼1 is 0, ∼0 is 1 | U+223C |
| Absolute value | ∣B | Magnitude of B | U+2223 |
| Index generator | ⍳B | Vector of the first B integers | U+2373 |
| Exponential | ⋆B | e to the B power | U+22C6 |
| Negation | −B | Changes sign of B | U+2212 |
| Identity | +B | No change to B | U+002B |
| Signum | ×B | ¯1 if B<0; 0 if B=0; 1 if B>0 | U+00D7 |
| Reciprocal | ÷B | 1 divided by B | U+00F7 |
| Ravel | ,B | Reshapes B into a vector | U+002C |
| Matrix inverse | ⌹B | Inverse of matrix B | U+2339 |
| Pi times | ○B | Multiply by π | U+25CB |
| Logarithm | ⍟B | Natural logarithm of B | U+235F |
| Reversal | ⌽B | Reverse elements of B along last axis | U+233D |
| Reversal | ⊖B | Reverse elements of B along first axis | U+2296 |
| Grade up | ⍋B | Indices of B which will arrange B in ascending order | U+234B |
| Grade down | ⍒B | Indices of B which will arrange B in descending order | U+2352 |
| Execute | ⍎B | Execute an APL expression | U+234E |
| Monadic format | ⍕B | A character representation of B | U+2355 |
| Monadic transpose | ⍉B | Reverse the axes of B | U+2349 |
| Factorial | !B | Product of integers 1 to B | U+0021 |
[edit] Dyadic functions
| Name | Notation | Meaning | Unicode codepoint |
|---|---|---|---|
| Add | A+B | Sum of A and B | U+002B |
| Subtract | A−B | A minus B | U+2212 |
| Multiply | A×B | A multiplied by B | U+00D7 |
| Divide | A÷B | A divided by B | U+00F7 |
| Exponentiation | A⋆B | A raised to the B power | U+22C6 |
| Circle | A○B | Trigonometric functions of B selected by A A=1: sin(B) A=2: cos(B) A=3: tan(B) |
U+25CB |
| Deal | A?B | A distinct integers selected randomly from the first B integers | U+003F |
| Membership | A∈B | 1 for elements of A present in B; 0 where not. | U+2208 |
| Maximum | A⌈B | The greater value of A or B | U+2308 |
| Minimum | A⌊B | The smaller value of A or B | U+230A |
| Reshape | A⍴B | Array of shape A with data B | U+2374 |
| Take | A↑B | Select the first (or last) A elements of B according to ×A | U+2191 |
| Drop | A↓B | Remove the first (or last) A elements of B according to ×A | U+2193 |
| Decode | A⊥B | Value of a polynomial whose coefficients are B at A | U+22A5 |
| Encode | A⊤B | Base-A representation of the value of B | U+22A4 |
| Residue | A∣B | The A modula value of B lying between A and 0 | U+2223 |
| Catenation | A,B | Elements of B appended to the elements of A | U+002C |
| Expansion | A\B | Insert zeros (or blanks) in B corresponding to zeros in A | U+005C |
| Compression | A/B | Select elements in B corresponding to ones in A | U+002F |
| Index of | A⍳B | The location (index) of B in A; 1+⌈/⍳⍴A if not found | U+2373 |
| Matrix divide | A⌹B | Solution to system of linear equations Ax = B | U+2339 |
| Rotation | A⌽B | The elements of B are rotated A positions | U+233D |
| Rotation | A⊖B | The elements of B are rotated A positions along the first axis | U+2296 |
| Logarithm | A⍟B | Logarithm of B to base A | U+235F |
| Dyadic format | A⍕B | Format B into a character matrix according to A | U+2355 |
| General transpose | A⍉B | The axes of B are ordered by A | U+2349 |
| Combinations | A!B | Number of combinations of B taken A at a time | U+0021 |
| Less than | A<B | Comparison: 1 if true, 0 if false | U+003C |
| Less than or equal | A≤B | Comparison: 1 if true, 0 if false | U+2264 |
| Equal | A=B | Comparison: 1 if true, 0 if false | U+003D |
| Greater than or equal | A≥B | Comparison: 1 if true, 0 if false | U+2265 |
| Greater than | A>B | Comparison: 1 if true, 0 if false | U+003E |
| Not equal | A≠B | Comparison: 1 if true, 0 if false | U+2260 |
| Or | A∨B | Logic: 0 if A and B are 0; 1 otherwise | U+2228 |
| And | A∧B | Logic: 1 if A and B are 1; 0 otherwise | U+2227 |
| Nor | A⍱B | Logic: 1 if both A and B are 0; otherwise 0 | U+2371 |
| Nand | A⍲B | Logic: 0 if both A and B are 1; otherwise 1 | U+2372 |
[edit] Operators
| Name | Symbol | Example | Meaning (of example) | Unicode codepoint sequence |
|---|---|---|---|---|
| Reduce (last axis) | / | +/B | Sum across B | U+002F |
| Reduce (first axis) | ⌿ | +⌿B | Sum down B | U+233F |
| Scan (last axis) | \ | +\B | Running sum across B | U+005C |
| Scan (first axis) | ⍀ | +⍀B | Running sum down B | U+2340 |
| Inner product | . | A+.×B | Matrix product of A and B | U+002E |
| Outer product | ∘. | A∘.×B | Outer product of A and B | U+2218, U+002E |
The reduce and scan operators expect a dyadic function on their left, forming a monadic composite function applied to the vector on its right.
The product operator "." expects a dyadic function on both its left and right, forming a dyadic composite function applied to the vectors on its left and right. If the function to the left of the dot is "∘" (signifying null) then the composite function is an outer product, otherwise it is an inner product. An inner product intended for conventional matrix multiplication uses the + and × functions, replacing these with other dyadic functions can result in useful alternative operations.
[edit] Miscellaneous
| Name | Symbol | Example | Meaning (of example) | Unicode codepoint |
|---|---|---|---|---|
| High minus | ¯ | ¯3 | Denotes a negative number | U+00AF |
[edit] Fonts
The Unicode Basic Multilingual Plane includes the APL symbols[1], which are therefore usually rendered accurately from the larger Unicode fonts installed with most modern operating systems. These fonts are rarely designed by typographers familiar with APL glyphs. So, while accurate, the glyphs may look unfamiliar to APL programmers, difficult to distinguish, or just graceless.
Some Unicode fonts have been designed to display APL well: APLX Upright, APL385 Unicode, and SimPL.
Before Unicode, APL interpreters were equipped with fonts in which APL characters were mapped to less commonly-used positions in the ASCII character sets. These mappings (and their national variations) were particular to interpreters. They made the display of APL programs on the Web problematic.
[edit] References
- Polivka, Raymond P.; & Pakin, Sandra (1975). APL: The Language and Its Usage. Prentice-Hall. ISBN 0-13-038885-8.