前文

∊ ~

Dyalog 中,字母 Epsilon,快捷键为 `e。单参数时,将参数中的各项“展平”成为一个数组,如:

      ∊ 2 3 ⍴ 1 2
1 2 1 2 1 2

双参数时,返回的是左侧各项在右侧出现与否,如:

      '没啥' 4 ∊ 4 '没' '没啥啊'
0 1
      (⍳6) ∊ 6 2 4 7
0 1 0 1 0 1

~

单参数时,取反:

      ~ 0 1 0 0
1 0 1 1

双参数时,从左边剔除右边的各项:

      3 1 4 1 5 ~ 5 1
3 4
      'aa' 'bb' 'cc' 'bb'  ~ 'bb' 'xx'
 aa  cc

对应中文语法

∊ 2 3 ⍴ 1 2
列出 2 3 重塑 1 2

'没啥' 4 ∊ 4 '没' '没啥啊'
'没啥' 4 属于 4 '没' '没啥啊'

~ 0 1 0 0
取反 0 1 0 0

3 1 4 1 5 ~ 5 1
3 1 4 1 5 剔除 5 1

下面是求某数以内所有质数的APL例程(详细分析见 APL wiki):

      R←10
      (~R∊R∘.×R)/R←1↓⍳R
2 3 5 7

用之前的设计将符号改为对应中文:

      R置为10
      (取反 R 属于 R 两两 相乘 R) 复刻 R 置为 1 去头 数列 R

如果用自然语言语法表达第二句,可以是:R置为2到R,从R剔除R自身张量积中的各项。

通过添加一些语法糖,比如 “2到R”对应“1 去头 数列 R”、“从R剔除..中的各项”<–>“(取反 R 属于 ..) 复刻 R”,减少了代码量的同时省去了括号。是否有比较通用的语法设计(以及代码风格)可以规避多数情况下括号的使用、同时保持一定可读性呢?