Tacit programming: Difference between revisions
mNo edit summary |
m (Paradigms category) |
||
Line 134: | Line 134: | ||
==References== | ==References== | ||
<references/> | <references/> | ||
{{APL syntax}} | {{APL syntax}}[[Category:Paradigms]] |
Revision as of 15:53, 30 April 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 functions (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.