Difference between revisions of "Tacit programming"

From APL Wiki
Jump to navigation Jump to search
Line 121: Line 121:
== External links ==
== External links ==
== Tutorials ==
== Tutorials ==
* Dyalog: [http://help.dyalog.com/16.0/Content/RelNotes14.0/Function%20Trains.htm version 14.0 release notes]
* APL Cultivation: [https://chat.stackexchange.com/rooms/52405/conversation/lesson-23-transcribing-to-and-reading-trains Transcribing to and reading trains]
* APL Cultivation: [https://chat.stackexchange.com/rooms/52405/conversation/lesson-23-transcribing-to-and-reading-trains Transcribing to and reading trains]
* APLtrainer: [https://www.youtube.com/watch?v=kt4lMZbn-so How to read trains in Dyalog APL code] (video)
* APLtrainer: [https://www.youtube.com/watch?v=kt4lMZbn-so How to read trains in Dyalog APL code] (video)

Revision as of 11:57, 4 March 2020

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




  1. dzaima/APL: Differences from Dyalog APL. Retrieved 09 Jan 2020.
APL syntax [edit]
General Comparison with traditional mathematicsPrecedenceTacit programming
Array Numeric literalStringStrand notationObject literalArray notation
Function ArgumentFunction valenceDerived functionDerived operatorNiladic functionMonadic functionDyadic functionAmbivalent functionTradfnDfnFunction train
Operator OperandOperator valenceTradopDopDerived operator
Assignment MultipleIndexedSelectiveModified
Other Function axisBranchSystem commandUser commandKeywordDot notationFunction-operator overloading