APL Symbol
   HOME

TheInfoList



OR:

The programming language APL 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 Mathematical notation consists of using glossary of mathematical symbols, symbols for representing operation (mathematics), operations, unspecified numbers, relation (mathematics), relations, and any other mathematical objects and assembling ...
to describe algorithms. 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.


Monadic and dyadic functions

Most symbols denote ''functions'' or ''operators''. 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.


Functions and operators

APL uses the term ''operator'' in Heaviside’s sense as a moderator of a function as opposed to some other programming language's use of the same term as something that operates on data, ref.
relational operator In computer science, a relational operator is a programming language construct or operator that tests or defines some kind of relation between two entities. These include numerical equality (e.g., ) and inequalities (e.g., ). In programmi ...
and operators generally. Other programming languages also sometimes use this term interchangeably with ''function'', however both terms are used in APL more precisely. Early definitions of APL symbols were very specific about how symbols were categorized. 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: In the above case, the reduce or slash operator ''moderates'' the ''multiply'' function. The expression ×/2 3 4 evaluates to a scalar (1 element only) result through reducing an array by multiplication. The above case is simplified, imagine multiplying (adding, subtracting or dividing) more than just a few numbers together. (From a vector, ×/ returns the product of all its elements.)
The above ''dyadic functions'' examples eft and right examples(using the same / symbol, right example) demonstrate how Boolean values (0s and 1s) can be used as left arguments for the \ expand and / replicate ''functions'' to produce exactly opposite results. On the left side, the 2-element
vector Vector most often refers to: * Euclidean vector, a quantity with a magnitude and a direction * Disease vector, an agent that carries and transmits an infectious pathogen into another living organism Vector may also refer to: Mathematics a ...
is expanded where Boolean 0s occur to result in a 3-element vector  — note how APL inserted a 0 into the vector. Conversely, the exact opposite occurs on the right side — where a 3-element vector becomes just 2-elements; Boolean 0s ''delete'' items using the dyadic / slash function. APL symbols also operate on lists (vector) of items using data types other than just numeric, for example a 2-element vector of character strings could be substituted for numeric vector above.


Syntax rules

In APL the precedence hierarchy for functions or operators is strictly positional: expressions are evaluated right-to-left. APL does not follow the usual
operator precedence In mathematics and computer programming, the order of operations is a collection of rules that reflect conventions about which operations to perform first in order to evaluate a given mathematical expression. These rules are formalized with a ...
of other programming languages; for example, × does not bind its operands any more "tightly" than +. Instead of operator precedence, APL defines a notion of ''scope''. The ''scope'' of a function determines its
arguments An argument is a series of sentences, statements, or propositions some of which are called premises and one is the conclusion. The purpose of an argument is to give reasons for one's conclusion via justification, explanation, and/or persua ...
. 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, (leftmost column below is actual program code from an APL user session, indented = actual user input, not-indented = result returned by APL interpreter): 1 ÷ 2 ⌊ 3 × 4 - 5 ¯0.3333333333 1 ÷ 2 ⌊ 3 × ¯1 ¯0.3333333333 1 ÷ 2 ⌊ ¯3 ¯0.3333333333 1 ÷ ¯3 ¯0.3333333333 << First note there are no parentheses and
APL is going to execute from right-to-left.
Step 1) 4-5 = -1. Step 2) 3 times -1 = -3.
Step 3) Take the floor or lower of 2 and -3 = -3.
Step 4) Divide 1 by -3 = -0.3333333333 = final result.
An operator may have function or data ''
operands In mathematics, an operand is the object of a mathematical operation, i.e., it is the object or quantity that is operated on. Unknown operands in equalities of expressions can be found by equation solving. Example The following arithmetic expres ...
'' 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 APL atomic or piecemeal sub-analysis (full explanation):
Beginning rightmost: ⍳¨3 3 produces a 2-element nested APL vector where each element is itself a vector . Iota ⍳3 by itself would produce . The diaeresis ¨ or mini double-dot means ''repeat'' or over each or ''perform each separately'' so iota repeats (in human i.e., reversed terms, the APL interpreter reads 3 3 over each use iota), concisely: iota for each 3. The left operand for the over-each operator ¨ is the index ⍳ function. The ''derived function'' ⍳¨ is used monadically and takes as its right operand 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 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 1 2 3 1 2 3 ∘.=/⍳¨3 3 1 0 0 0 1 0 0 0 1
Equivalent results in APL: (⍳3)(⍳3) and << Rightmost expression is . The matrix of 1s and 0s similarly produced by ∘.=/⍳¨3 3 and (⍳3)∘.=⍳3 is called an
identity matrix In linear algebra, the identity matrix of size n is the n\times n square matrix with ones on the main diagonal and zeros elsewhere. It has unique properties, for example when the identity matrix represents a geometric transformation, the obje ...
. Identity matrices are useful in solving matrix determinants, groups of linear equations and multiple regression.
im ← ∘.=⍨∘⍳ im 3 1 0 0 0 1 0 0 0 1 Some APL interpreters support the compose operator ∘ and the commute operator ⍨. The former ∘ glues functions together so that foo∘bar, for example, could be a hypothetical function that applies defined function ''foo'' to the result of defined function ''bar''; foo and bar can represent ''any'' existing function. In cases 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 or composed function (named ''im'' at left) is used in the APL user session to return a 9- element identity matrix using its right
argument An argument is a series of sentences, statements, or propositions some of which are called premises and one is the conclusion. The purpose of an argument is to give reasons for one's conclusion via justification, explanation, and/or persu ...
,
parameter A parameter (), generally, is any characteristic that can help in defining or classifying a particular system (meaning an event, project, object, situation, etc.). That is, a parameter is an element of a system that is useful, or critical, when ...
or operand = 3.
Letters←"ABCDE" Letters ABCDE ⍴Letters 5 FindIt←"CABS" FindIt CABS ⍴FindIt 4 Letters ⍳ FindIt 3 1 2 6 Example using APL to index ⍳ or find (or not find) elements in a character vector: First, variable Letters is assigned a vector of 5-elements, in this case - letters of the alphabet. The shape ⍴ or character vector-length of Letters is 5. Variable FindIt is assigned what to search for in Letters and its length is 4 characters. 1 2 3 4 5 << vector positions or index #'s in Letters
ABCDE At left, dyadic function iota searches through its left argument(Letters) for the search string (iota's right argument, FindIt). Iota finds letter "C" at position 3 in Letters, it finds "A" at position 1, and "B" at position 2. Iota does not find letter "S" anywhere in variable Letters so it returns the number 6 which is 1 greater than the length of Letters. Iota found letters "CAB" (3 1 2). Iota correctly did not find "S" (6).


Monadic functions


Dyadic functions


Operators and axis indicator

Notes: 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. Some functions can be followed by an axis indicator in (square) brackets, i.e., this appears between a function and an array and should not be confused with array subscripts written after an array. For example, given the ⌽ (reversal) function and a two-dimensional array, the function by default operates along the last axis but this can be changed using an axis indicator: A←4 3⍴⍳12 A 1 2 3 4 5 6 7 8 9 10 11 12 ⌽A 3 2 1 6 5 4 9 8 7 12 11 10 ⌽ 10 11 12 7 8 9 4 5 6 1 2 3 ⊖⌽A 12 11 10 9 8 7 6 5 4 3 2 1 ⍉A 1 4 7 10 2 5 8 11 3 6 9 12
4 rows by 3 cols matrix created, using rho ⍴ and iota ⍳. The 4 x 3 matrix is then stored in a variable named A. A is now reflected or flipped along its vertical axis as symbol ⌽ visually indicates. A is now reflected using the axis indicator or first dimension modifier. The result is that variable A has been reflected across the horizontal axis, instead of vertically. A is now reflected both vertically ⊖ and horizontally ⌽. A is ⍉ transposed to a 3 row by 4 col matrix such that rows-cols become exchanged, as symbol ⍉ visually portrays. Compare the result here to the original matrix stored in A, topmost matrix. These types of data transformations are useful in
time series In mathematics, a time series is a series of data points indexed (or listed or graphed) in time order. Most commonly, a time series is a sequence taken at successive equally spaced points in time. Thus it is a sequence of discrete-time data. ...
analysis and spatial coordinates, just two examples, more exist.
As a particular case, if the dyadic catenate "," function is followed by an ''axis indicator'' (or ''axis modifier'' to a symbol/function), it can be used to laminate (interpose) two arrays depending on whether the axis indicator is less than or greater than the index origin (index origin = 1 in illustration below): B←1 2 3 4 C←5 6 7 8 B,C 1 2 3 4 5 6 7 8 B, .5 1 2 3 4 5 6 7 8 B, .5 1 5 2 6 3 7 4 8 At left, variable 'B' is first assigned a vector of 4 consecutive integers (e.g., ⍳4).
Var C is then assigned 4 more consecutive integers (such as 4+⍳4).
'B' and C are then concatenated or raveled together for illustration purposes,
resulting in a single vector (⍳8). In the particular case at left, if the dyadic catenate "," function is followed by an axis indicator ( .5'' which is ''less than 1''), it can be used to laminate (interpose) two arrays (vectors in this case) depending on whether the axis indicator is less than or greater than the index origin(1). The ''first'' result (of B, .5) is a 2 row by 4 column matrix, vertically joining 'B' and C row-wise. The ''second'' result (of B, .5 which is ''greater than 1'') is a 4 row by 2 column matrix.


Nested arrays

''
Arrays An array is a systematic arrangement of similar objects, usually in rows and columns. Things called an array include: {{TOC right Music * In twelve-tone and serial composition, the presentation of simultaneous twelve-tone sets such that the ...
'' are structures which have elements grouped linearly as vectors or in table form as
matrices Matrix (: matrices or matrixes) or MATRIX may refer to: Science and mathematics * Matrix (mathematics), a rectangular array of numbers, symbols or expressions * Matrix (logic), part of a formula in prenex normal form * Matrix (biology), the ...
—and higher dimensions (3D or cubed, 4D or cubed over time, etc.). Arrays containing both characters and numbers are termed ''mixed arrays''. Array structures containing elements which are also arrays are called ''nested arrays''.


Flow control

A ''user'' may define custom ''functions'' which, like variables, are identified by ''name'' rather than by a non-textual symbol. The ''function header'' defines whether a custom function is niladic (no arguments), monadic (one right argument) or dyadic (left and right arguments), the local name of the ''result'' (to the left of the ''← assign'' arrow), and whether it has any local variables (each separated by semicolon ';'). Whether functions with the same identifier but different adicity are distinct is implementation-defined. If allowed, then a function CURVEAREA could be defined twice to replace both monadic CIRCLEAREA and dyadic SEGMENTAREA above, with the monadic or dyadic function being selected by the context in which it was referenced. Custom dyadic functions may usually be applied to parameters with the same conventions as built-in functions, i.e., arrays should either have the same number of elements or one of them should have a single element which is extended. There are exceptions to this, for example a function to convert pre-decimal UK currency to dollars would expect to take a parameter with precisely three elements representing pounds, shillings and pence.Berry, Pau
"APL\360 Primer Student Text"
IBM Research, Thomas J. Watson Research Center, 1969.
Inside a program or a custom function, control may be conditionally transferred to a statement identified by a line number or explicit label; if the target is 0 (zero) this terminates the program or returns to a function's caller. The most common form uses the APL compression function, as in the template (condition)/target which has the effect of evaluating the condition to 0 (false) or 1 (true) and then using that to mask the target (if the condition is false it is ignored, if true it is left alone so control is transferred). Hence function SEGMENTAREA may be modified to abort (just below), returning zero if the parameters (DEGREES and RADIUS below) are of ''different'' sign: ∇ AREA←DEGREES SEGMENTAREA RADIUS ; FRACTION ; CA ; SIGN ⍝ local variables denoted by semicolon(;) FRACTION←DEGREES÷360 CA←CIRCLEAREA RADIUS ⍝ this APL code statement calls user function CIRCLEAREA, defined up above. SIGN←(×DEGREES)≠×RADIUS ⍝ << APL logic TEST/determine whether DEGREES and RADIUS do NOT (≠ used) have same SIGN 1-yes different(≠), 0-no(same sign) AREA←0 ⍝ default value of AREA set = zero →SIGN/0 ⍝ branching(here, exiting) occurs when SIGN=1 while SIGN=0 does NOT branch to 0. Branching to 0 exits function. AREA←FRACTION×CA ∇ The above function SEGMENTAREA ''works as expected if'' the parameters are ''scalars or single-element arrays'', but not if they are multiple-element arrays since the condition ends up being based on a single element of the SIGN array - on the other hand, the user function could be modified to correctly handle vectorized arguments. Operation can sometimes be unpredictable since APL defines that computers with vector-processing capabilities ''should'' parallelise and ''may'' reorder array operations as far as possible - thus, test and debug ''user functions'' particularly if they will be used with vector or even matrix arguments. This affects not only explicit application of a custom function to arrays, but also its use anywhere that a dyadic function may reasonably be used such as in generation of a table of results: 90 180 270 ¯90 ∘.SEGMENTAREA 1 ¯2 4 0 0 0 0 0 0 0 0 0 0 0 0 A more concise way and sometimes better way - to formulate a function is to avoid explicit transfers of control, instead using expressions which evaluate correctly in all or the expected conditions. Sometimes it is correct to let a function fail when one or both input arguments are incorrect - precisely to let user know that one or both arguments used were incorrect. The following is more concise than the above SEGMENTAREA function. The below importantly correctly handles vectorized arguments: ∇ AREA←DEGREES SEGMENTAREA RADIUS ; FRACTION ; CA ; SIGN FRACTION←DEGREES÷360 CA←CIRCLEAREA RADIUS SIGN←(×DEGREES)≠×RADIUS AREA←FRACTION×CA×~SIGN ⍝ this APL statement is more complex, as a one-liner - but it solves vectorized arguments: a tradeoff - complexity vs. branching ∇ 90 180 270 ¯90 ∘.SEGMENTAREA 1 ¯2 4 0.785398163 0 12.5663706 1.57079633 0 25.1327412 2.35619449 0 37.6991118 0 ¯3.14159265 0 Avoiding explicit transfers of control also called branching, if not reviewed or carefully controlled - can promote use of excessively complex ''one liners'', veritably "misunderstood and complex idioms" and a "write-only" style, which has done little to endear APL to influential commentators such as
Edsger Dijkstra Edsger Wybe Dijkstra ( ; ; 11 May 1930 – 6 August 2002) was a Dutch computer scientist, programmer, software engineer, mathematician, and science essayist. Born in Rotterdam in the Netherlands, Dijkstra studied mathematics and physics and the ...
. ''Conversely however'' APL idioms can be fun, educational and useful - if used with helpful comments ⍝, for example including source and intended meaning and function of the idiom(s). Here is an APL idioms list
a
IBM APL2 idioms list here
an
Finnish APL idiom library here


Miscellaneous

Most APL implementations support a number of system variables and functions, usually preceded by the ⎕ (quad) and/or ")" (hook=close parenthesis) character. Note that the quad character is not the same as the Unicode missing character symbol. Particularly important and widely implemented is the ⎕IO ( Index Origin) variable, since while the original IBM APL based its arrays on 1 some newer variants base them on zero: There are also system functions available to users for saving the current workspace e.g., )SAVE and terminating the APL environment, e.g., )OFF - sometimes called ''hook'' commands or functions due to the use of a leading right parenthesis or hook. There is some standardization of these quad and hook functions.


Fonts

The Unicode
Basic Multilingual Plane In the Unicode standard, a plane is a contiguous group of 65,536 (216) code points. There are 17 planes, identified by the numbers 0 to 16, which corresponds with the possible values 00–1016 of the first two positions in six position hexadecimal ...
includes the APL symbols in the
Miscellaneous Technical Miscellaneous Technical is a Unicode block ranging from U+2300 to U+23FF. It contains various common symbols which are related to and used in the various technical, programming language, and academic professions. For example: * Symbol ⌂ (HTML ...
block,Unicode chart which are thus 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 or be difficult to distinguish from one another. Some Unicode fonts have been designed to display APL well: APLX Upright, APL385 Unicode, and SimPL. Before Unicode, APL interpreters were supplied with fonts in which APL characters were mapped to less commonly used positions in the ASCII character sets, usually in the upper 128 code points. These mappings (and their national variations) were sometimes unique to each APL vendor's interpreter, which made the display of APL programs on the Web, in text files and manuals - frequently problematic.


APL2 keyboard function to symbol mapping

Note the APL On/Off Key - topmost-rightmost key, just below. Also note the keyboard had some 55 unique (68 listed per tables above, including comparative symbols but several symbols appear in ''both'' monadic and dyadic tables) APL symbol keys (55 APL functions (operators) are listed in IBM's 5110 APL Reference Manual), thus with the use of alt, shift and ctrl keys - it would theoretically have allowed a maximum of some 59 (keys) *4 (with 2-key pressing) *3 (with tri-key pressing, e.g., ctrl-alt-del) or some 472 different maximum key combinations, approaching the 512
EBCDIC Extended Binary Coded Decimal Interchange Code (EBCDIC; ) is an eight- bit character encoding used mainly on IBM mainframe and IBM midrange computer operating systems. It descended from the code used with punched cards and the corresponding si ...
character max (256 chars times 2 codes for each keys-combination). Again, in theory the keyboard pictured here would have allowed for about 472 different APL symbols/functions to be keyboard-input, actively used. In practice, early versions were only using something ''roughly'' equivalent to 55 APL special symbols (excluding letters, numbers, punctuation, etc. keys). Thus, early APL was then only using about 11% (55/472) of a symbolic language's at-that-time utilization potential, based on keyboard # keys limits, again excluding numbers, letters, punctuation, etc. In another sense keyboard symbols utilization was closer to 100%, highly efficient, since EBCDIC only allowed 256 distinct chars, and
ASCII ASCII ( ), an acronym for American Standard Code for Information Interchange, is a character encoding standard for representing a particular set of 95 (English language focused) printable character, printable and 33 control character, control c ...
only 128.


Solving puzzles

APL has proved to be extremely useful in solving mathematical puzzles, several of which are described below.


Pascal's triangle

Take
Pascal's triangle In mathematics, Pascal's triangle is an infinite triangular array of the binomial coefficients which play a crucial role in probability theory, combinatorics, and algebra. In much of the Western world, it is named after the French mathematician Bla ...
, which is a triangular array of numbers in which those at the ends of the rows are 1 and each of the other numbers is the sum of the nearest two numbers in the row just above it (the apex, 1, being at the top). The following is an APL one-liner function to visually depict Pascal's triangle: Pascal ← ⍝ Create a one-line user function called Pascal Pascal 7 ⍝ Run function Pascal for seven rows and show the results below: 1 1 2 1 3 3 1 4 6 4 1 5 10 10 5 1 6 15 20 15 6 1 7 21 35 35 21 7


Prime numbers, contra proof via factors

Determine the number of ''
prime numbers A prime number (or a prime) is a natural number greater than 1 that is not a product of two smaller natural numbers. A natural number greater than 1 that is not prime is called a composite number. For example, 5 is prime because the only ways ...
'' (prime # is a natural number greater than 1 that has no positive divisors other than 1 and itself) up to some number N. Ken Iverson is credited with the following one-liner APL solution to the problem: ⎕CR 'PrimeNumbers' ⍝ Show APL user-function PrimeNumbers Primes←PrimeNumbers N ⍝ Function takes one right arg N (e.g., show prime numbers for 1 ... int N) Primes←(2=+⌿0=(⍳N)∘., ⍳N)/⍳N ⍝ The Ken Iverson one-liner PrimeNumbers 100 ⍝ Show all prime numbers from 1 to 100 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 ⍴PrimeNumbers 100 25 ⍝ There are twenty-five prime numbers in the range up to 100. Examining the converse or opposite of a mathematical solution is frequently needed ('' integer factors of a number''): Prove for the subset of integers from 1 through 15 that they are non-prime by listing their ''decomposition factors''. What are their non-one factors (#'s divisible by, except 1)? ⎕CR 'ProveNonPrime' Z←ProveNonPrime R ⍝Show all factors of an integer R - except 1 and the number itself, ⍝ i.e., prove Non-Prime. String 'prime' is returned for a Prime integer. Z←(0=(⍳R), R)/⍳R ⍝ Determine all factors for integer R, store into Z Z←(~(Z∊1,R))/Z ⍝ Delete 1 and the number as factors for the number from Z. →(0=⍴Z)/ProveNonPrimeIsPrime ⍝ If result has zero shape, it has no other factors and is therefore prime Z←R,(⊂" factors(except 1) "),(⊂Z),⎕TCNL ⍝ Show the number R, its factors(except 1,itself), and a new line char →0 ⍝ Done with function if non-prime ProveNonPrimeIsPrime: Z←R,(⊂" prime"),⎕TCNL ⍝ function branches here if number was prime ProveNonPrime ¨⍳15 ⍝ Prove non primes for each(¨) of the integers from 1 through 15 (iota 15) 1 prime 2 prime 3 prime 4 factors(except 1) 2 5 prime 6 factors(except 1) 2 3 7 prime 8 factors(except 1) 2 4 9 factors(except 1) 3 10 factors(except 1) 2 5 11 prime 12 factors(except 1) 2 3 4 6 13 prime 14 factors(except 1) 2 7 15 factors(except 1) 3 5


Fibonacci sequence

Generate a
Fibonacci number In mathematics, the Fibonacci sequence is a Integer sequence, sequence in which each element is the sum of the two elements that precede it. Numbers that are part of the Fibonacci sequence are known as Fibonacci numbers, commonly denoted . Many w ...
sequence, where each subsequent number in the sequence is the sum of the prior two: ⎕CR 'Fibonacci' ⍝ Display function Fibonacci FibonacciNum←Fibonacci Nth;IOwas ⍝ Funct header, funct name=Fibonacci, monadic funct with 1 right hand arg Nth;local var IOwas, and a returned num. ⍝Generate a Fibonacci sequenced number where Nth is the position # of the Fibonacci number in the sequence. << function description IOwas←⎕IO ⋄ ⎕IO←0 ⋄ FibonacciNum←↑0 1↓↑+.×/Nth/⊂2 2⍴1 1 1 0 ⋄ ⎕IO←IOwas ⍝ In order for this function to work correctly ⎕IO must be set to zero. Fibonacci¨⍳14 ⍝ This APL statement says: Generate the Fibonacci sequence over each(¨) integer number(iota or ⍳) for the integers 1..14. 0 1 1 2 3 5 8 13 21 34 55 89 144 233 ⍝ Generated sequence, i.e., the Fibonacci sequence of numbers generated by APL's interpreter.


Further reading

* * * *


See also

*
Miscellaneous Technical Miscellaneous Technical is a Unicode block ranging from U+2300 to U+23FF. It contains various common symbols which are related to and used in the various technical, programming language, and academic professions. For example: * Symbol ⌂ (HTML ...
– Unicode block including APL keys * APL (codepage) § Keyboard layout – More modern APL keyboard layout information


References


External links

* APL character reference
Page 1

British APL Association fonts page


aka the APL code page on mainframes
General information about APL chars
on the APL wiki

*


Generic online tutorials


A Practical Introduction to APL 1 & APL 2
by Graeme Donald Robertson
APL for PCs, Servers and Tablets - NARS
full-featured, no restrictions, free downloadable APL/2 with nested arrays by Sudley Place Software
GNU APL
free downloadable interpreter for APL by Jürgen Sauermann
YouTube APL Tutorials
uploaded by Jimin Park, 8 intro/beginner instructional videos.



by MicroAPL


Syntax rules

* * * {{Mathematical symbols notation language Programming language syntax APL programming language family