# Tacit programming: Difference between revisions

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.

## 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 a monadic operator and an operand, or from a dyadic operator and two operands are tacit functions:

Sum ← +/ Sum ⍳10 55 Dot ← +.× 3 1 4 dot 2 7 1 17

## Derived operators

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

1(+⍣2)10 12 Twice ← ⍣2 1 +Twice 10 12

## Trains

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 `A∘h`

.^{[1]}

## 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 ¯2 5 (+,-) 2 ⍝ 5±2 7 3

### Arithmetic mean

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

### Fractions

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

(1∧⊢,÷)2.625 21 8

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

(1∧0 1∘⊤,÷)2.625 2 5 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 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

## Tutorials

- Dyalog: version 14.0 release notes
- APL Cultivation: Transcribing to and reading trains
- APLtrainer: How to read trains in Dyalog APL code (video)
- APLtrainer: Function trains in APL (video)
- Dyalog Webinar: Train Spotting in Dyalog APL (video)
- Dyalog '13: Train Spotting in Version 14.0 (video)

## Documentation

## References

- ↑ dzaima/APL: Differences from Dyalog APL. Retrieved 09 Jan 2020.