APL
不撸兔子
简介
APL (A Programming Language 或者 APL Programming Language)是 Kenneth E. Iverson 于 1960 左右发明的一门基于数组的编程语言。紧凑而特殊的数学符号是它最鲜明的特点。
简单的程序
APL 的 Hello world
1 | 'Hello, world' |
诶看起来好简单。因为 APL 是一个解释型语言。所以不用打印函数也是可以得。
那么再看一下比较简单的 APL 程序。下面是一个选择六个随机数的程序。
$x[⍋x←6?40]$
等会怎么变成数学公式了。因为 APL 大部分符号都是数学符号,所以用数学公式的方式显示比较自然。
如果熟悉了其中符号的含义,就能很轻松的理解了。
从右到左
$]$ 搭配左边的 $[$ 相当于数组下表访问符。
$?$ 是随机函数。$6?40$ 表示使用不放回的方式从 $[1,40] $ 抽取 6 次。
$←$ 赋值符号
$x$ 变量,可以是 $a$ , $b$ , $suibian$ 等。
$⍋$ 递增排序,返回下标。$⍋$ 7 5 6 8 的结果是 2 3 1 4 。最小的数是 5 ,对应的下标是 2 (下标从 1 开始不是 0 )
所以程序是这样运行的。
$6?40$ 随机结果为 34 3 6 36 26 20
$x←6?40$ ,x 为 34 3 6 36 26 20
$⍋x$ 递增排序,返回下标 2 3 6 5 1 4
x[2 3 6 5 1 4] 结果为 3 6 20 26 34 36
果然是很简单的程序呢。
Primitive
一元形式
Name(s) | Notation | Meaning | Unicode codepoint |
---|---|---|---|
Roll | ?B |
从 $[1,B]$ 中随机一个数 | U+003F ? |
Ceiling | ⌈B |
大于等于 B 的最小整数 | U+2308 ⌈ |
Floor | ⌊B |
小于等于 B 的最大整数 | U+230A ⌊ |
Shape, Rho | ⍴B |
B 的组件每个维度的数量 | U+2374 ⍴ |
Not, Tilde | ∼B |
∼1 为 0, ∼0 为 1 | U+223C ∼ |
Absolute value | ∣B |
B 的模 | U+2223 ∣ |
Index generator, Iota | ⍳B |
产生从1 到 B 的序列 | U+2373 ⍳ |
Exponential | ⋆B |
$e^B$ | U+22C6 ⋆ |
Negation | −B |
B 的相反数 | U+2212 − |
Identity | +B |
返回 B | U+002B + |
Signum | ×B |
返回 B 的符号。小于 0 返回¯1, 等于 0 返回 0 ,大于0 返回 1 | U+00D7 × |
Reciprocal | ÷B |
$1/B$ | U+00F7 ÷ |
Ravel, Catenate, Laminate | ,B |
重塑 B 为向量 | U+002C , |
Matrix inverse, Monadic Quad Divide | ⌹B |
矩阵 B 的逆 | U+2339 ⌹ |
Pi times | ○B |
$B \times \pi$ | U+25CB ○ |
Logarithm | ⍟B |
$\ln B$ | U+235F ⍟ |
Reversal | ⌽B |
沿着最后一个数轴反转 B 的元素 | U+233D ⌽ |
Reversal | ⊖B |
沿着第一个数轴反转 B 的元素 | U+2296 ⊖ |
Grade up | ⍋B |
返回升序排序 B 后元素下标 | U+234B ⍋ |
Grade down | ⍒B |
返回降序排序 B 后元素下表 | U+2352 ⍒ |
Execute | ⍎B |
执行一个 APL 表达式 | U+234E ⍎ |
Monadic format | ⍕B |
最简化 B | U+2355 ⍕ |
Monadic transpose | ⍉B |
转置矩阵 B | U+2349 ⍉ |
Factorial | !B |
B! 从 1 乘到 B | U+0021 ! |
二元形式
Name(s) | Notation | Meaning | Unicodecodepoint |
---|---|---|---|
Add | A+B |
A 加 B | U+002B + |
Subtract | A−B |
A 减 B | U+2212 − |
Multiply | A×B |
A 乘以 B | U+00D7 × |
Divide) | A÷B |
A 除以 B | U+00F7 ÷ |
Exponentiation | A⋆B |
A 的 B 次方 | U+22C6 ⋆ |
Circle | A○B |
A = 1: $\sin(B)$ A = 2: $\cos(B)$ A = 3: $\tan(B)$ A=5: $\sinh(B)$ A = 6: $\cosh(B)$ A = 7: $\tanh(B)$ | U+25CB ○ |
Deal | A?B |
不放回从 $[1,B]$ 抽取 A 次 | U+003F ? |
Membership, Epsilon | A∈B |
返回 1 ,如果 A 在 B 中,否则返回 0 | U+2208 ∈ |
Maximum, Ceiling | A⌈B |
返回 A 和 B 中最大的一个 | U+2308 ⌈ |
Minimum, Floor | A⌊B |
返回 A 和 B 中最小的一个 | U+230A ⌊ |
Reshape, Dyadic Rho | A⍴B |
A 型数组,B 为数据。 | U+2374 ⍴ |
Take | A↑B |
根据 ×A 选择 B 中前(或后)A 个元素 | U+2191 ↑ |
Drop | A↓B |
根据 ×A 丢弃 B 中前(或后)A 个元素 | U+2193 ↓ |
Decode | A⊥B |
Value of a polynomial whose coefficients are B at A | U+22A5 ⊥ |
Encode | A⊤B |
Base-A representation of the value of B | U+22A4 ⊤ |
Residue | A∣B |
B 模 A | U+2223 ∣ |
Catenation | A,B |
B 拼接 A | U+002C , |
Expansion, Dyadic Backslash | A\B |
根据 A 中 0 的位置在 B 中插入 0 (或空格) | U+005C \ |
Compression, Dyadic Slash | A/B |
根据 A 中 1 的位置在 B 中选择元素 | U+002F / |
Index of, Dyadic Iota | A⍳B |
A 在 B 中的下标。如果不在返回 1+⍴A |
U+2373 ⍳ |
Matrix divide, Dyadic Quad Divide | A⌹B |
矩阵除法 | U+2339 ⌹ |
Rotation | A⌽B |
The elements of B are rotated A positions | U+233D ⌽ |
Rotation | A⊖B |
The elements of B are rotated A positions along the first axis | U+2296 ⊖ |
Logarithm | A⍟B |
$\log_{A}{B}$ | U+235F ⍟ |
Dyadic format | A⍕B |
Format B into a character matrix according to A | U+2355 ⍕ |
General transpose | A⍉B |
The axes of B are ordered by A | U+2349 ⍉ |
Combinations | A!B |
二项式$C^{a}_{b}$ | U+0021 ! |
Diaeresis, Dieresis, Double-Dot | A¨B |
Over each, or perform each separately; B = on these; A = operation to perform or using(e.g. iota) | U+00A8 ¨ |
Less than | A<B |
小于返回 1 ,否则返回 0 | U+003C < |
Less than or equal | A≤B |
小于等于返回 1,否则返回 0 | U+2264 ≤ |
Equal) | A=B |
等于返回 1 ,否则返回 0 | U+003D = |
Greater than or equal | A≥B |
大于等于返回 1,否则返回 0 | U+2265 ≥ |
Greater than | A>B |
大于返回 1 ,否则返回 0 | U+003E > |
Not equal | A≠B |
不等于返回 1 ,否则返回 0 | U+2260 ≠ |
Or | A∨B |
二进制或,A 和 B 都为 0 时返回 0 。否则返回 1 | U+2228 ∨ |
And | A∧B |
二进制与,A 和 B 都为 1 时返回 1 。否则返回 0 | U+2227 ∧ |
Nor | A⍱B |
二进制或非。 | U+2371 ⍱ |
Nand | A⍲B |
二进制与非 | U+2372 ⍲ |
更多例子参考维基。
实例
生命游戏
$life←{↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵}$
字数排序
$X[⍋X+.≠’ ‘;]$
移除 HTML 标签
1 | txt←'<html><body><p>This is <em>emphasized</em> text.</p></body></html>' |
最后
APL 的奇怪符号可以通过专用键盘输入。如果你不喜欢这种奇怪的符号,那么……