# Tacit programming

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.

## Primitives

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

      plus ← +
times ← ×
6 times 3 plus 5
48


## Derived functions

Functions derived from an operator and operand are tacit.

      sum ← +/
sum ⍳10
55


## Trains

A train is a series of functions in isolation. An isolated function is either surrounded by parentheses or named. 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 (but not an atop) can be an array:

  (A g h) ⍵ ⬄ A g (  h ⍵)
⍺ (A g h) ⍵ ⬄ A g (⍺ h ⍵)


## Examples

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
1 2 3 (+,-) 4
5 6 7 ¯3 ¯2 ¯1
(2 3⍴0) (+,-) 1
1 1 1 ¯1 ¯1 ¯1
1 1 1 ¯1 ¯1 ¯1


### Arithmetic mean

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


### Top-heavy fraction as decimal

      (1∧⊢,÷) 1.125
9 8


### Is it a palindrome?

      (⌽≡⊢)'racecar'
1
(⌽≡⊢)'racecat'
0


### Split delimited text

      ','(≠⊆⊢)'comma,delimited,text'
┌─────┬─────────┬────┐
│comma│delimited│text│
└─────┴─────────┴────┘
' '(≠⊆⊢)'space 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 a in the direction of another vector b.

${\displaystyle {\textbf {a}}_{\textbf {b}}=({\textbf {a}}\cdot {\hat {\textbf {b}}}){\hat {\textbf {b}}}}$

      Sqrt ← *∘.5              ⍝ Square root
Norm ← Sqrt+.×⍨          ⍝ 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


In particular, the definition of InDirOf resembles the definition in traditional mathematical notation:

${\displaystyle |{\textbf {b}}|}$
(Sqrt+.×⍨) b

${\displaystyle {\hat {\textbf {b}}}={\frac {\textbf {b}}{|{\textbf {b}}|}}}$
(÷∘Norm⍨) b

${\displaystyle {\textbf {a}}\cdot {\textbf {b}}}$
a +.× b

${\displaystyle ({\textbf {a}}\cdot {\hat {\textbf {b}}}){\hat {\textbf {b}}}}$
a (⊢×+.×)∘Unit b


APL features 
Built-ins Primitives (functions, operators) ∙ Quad name
Array model ShapeRankDepthBoundIndex (Indexing) ∙ AxisRavelRavel orderElementScalarVectorMatrixSimple scalarSimple arrayNested arrayCellMajor cellSubarrayEmpty arrayPrototype
Data types Number (Boolean, Complex number) ∙ Character (String) ∙ BoxNamespaceFunction array
Concepts and paradigms Conformability (Scalar extension, Leading axis agreement) ∙ Scalar function (Pervasion) ∙ Identity elementComplex floorTotal array orderingTacit programming (Function composition, Close composition) ∙ Glyph
Errors LIMIT ERRORRANK ERRORSYNTAX ERRORDOMAIN ERRORLENGTH ERRORINDEX ERRORVALUE ERROR
APL syntax 
General Comparison with traditional mathematicsPrecedenceTacit programming (Train, Hook, Split composition)
Array Numeric literalStringStrand notationObject literalArray notation (design considerations)