Tacit programming

From APL Wiki
Jump to navigation Jump to search

Tacit functions apply to implicit arguments following a small set of rules. This is in contrast to the explicit use of arguments in dfns ( ) and tradfns (which have named arguments). Known dialects which implement trains are Dyalog APL, dzaima/APL, ngn/apl and NARS2000.



All primitive functions are tacit. Some APLs allow primitive functions to be named.

      plus  +
      times  ×
      6 times 3 plus 5

Derived functions

Functions derived from a monadic operator and an operand, or from a dyadic operator and two operands are tacit functions:

      Sum  +/
      Sum 10

      Dot  +.×
      3 1 4 dot 2 7 1

Derived operators

A dyadic operator with its right operand forms a tacit monadic operator:

      Twice  2
      1 +Twice 10


A train is a series of functions in isolation. An isolated function is either surrounded by parentheses or named. Below, and refer to the arguments of the train. f, g, and h are function (which themselves can be tacit or not), and A is an array. The arguments are processed by the following rules:

A 2-train is an atop:

  (g h) 
g (  h )
 (g h) 
g ( h )

A 3-train is a fork:

  (f g h) 
(  f ) g (  h )
 (f g h) 
( f ) g ( h )

The left tine of a fork can be an array:

  (A g h)
A g (  h )
 (A g h) 
A g ( h )

Only dzaima/APL allows (A h), which it treats as Ah.[1]


One of the major benefits of tacit programming is the ability to convey a short, well-defined idea as an isolated expression. This aids both human readability (semantic density) and the computer's ability to interpret code, potentially executing special code for particular idioms.

Plus and minus

      (+,-) 2     ⍝ ±2
2 ¯2
      5 (+,-) 2   ⍝ 5±2
7 3

Arithmetic mean

      (+÷≢) 10       ⍝ Mean of the first ten integers
      (+÷≢) 5 4⍴⍳4    ⍝ Mean of columns in a matrix
1 2 3 4


We can convert decimal numbers to fractions. For example, we can convert   to the improper fraction   with

21 8

Alternatively, we can convert it to the mixed fraction   with A mixed fraction:

      (10 1⊤,÷)2.625
2 5 8

Is it a palindrome?


Split delimited text

      ' '()'space delimited text'

Component of a vector in the direction of another vector

Sometimes a train can make an expression nicely resemble its equivalent definition in traditional mathematical notation. As an example, here is a program to compute the component of a vector   in the direction of another vector  :

      Root  *÷              ⍝ Nth root
      Norm  2 Root +.×       ⍝ Magnitude (norm) of numeric vector in Euclidean space
      Unit  ⊢÷Norm            ⍝ Unit vector in direction of vector ⍵
      InDirOf  (⊢×+.×)Unit   ⍝ Component of vector ⍺ in direction of vector ⍵
      3 5 2 InDirOf 0 0 1      ⍝ Trivial example
0 0 2

For a more parallel comparison of the notations, see the comparison with traditional mathematics.

External links