不撸兔子

简介

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
2
txt←'<html><body><p>This is <em>emphasized</em> text.</p></body></html>'
⎕←{⍵/⍨~{⍵∨≠\⍵}⍵∊'<>'}txt

最后

APL 的奇怪符号可以通过专用键盘输入。如果你不喜欢这种奇怪的符号,那么……