在 J. Barkley Rosser 的“数学家的逻辑”中,他使用符号来避免过多的括号。虽然我不知道逻辑学家什么时候开始使用这种符号,但我知道那本书于 1957 年首次出版,以及JGP Nicod 的论文于 1916 年发表的论文也使用了这种符号。所以很明显它有相当长的历史,尽管现在这不受现代逻辑学家的青睐。
在编程世界中,在类似 LISP 的编程语言中,程序员要跟踪正确(巨大!)数量的括号是一个巨大的挑战。Haskell 提供了一个操作符$
来提供部分功能,但是你不能说它2 * $ 3 + 4
没有点那么强大(见下面的例子)。C 语言序列使用常规操作优先级,但在某些情况下仍需要深嵌套括号。所以我想知道为什么没有实际的语言使用这种策略?我试过了,但我发现我什至无法为它写一个语法!
让我展示一个只有两个运算符+
and的玩具计算器语言示例*
,所有项都是整数。
使用此符号,翻译器应通过以下测试用例:
1 + 3 .* 2
= (1 + 3) * 2
1 *. 3 + 2
= 1 * (3 + 2)
1 *. 2 +. 2
= (1 * 2) + 2
2 *: 2 + 3 .* 4
= 2 * ((2 + 3) * 4)
我无法解释这个符号的所有细节,它在 Rosser 的书中花费了将近 5 页。但在一般情况下(也很短),.
运算符之前或之后的点代表“分隔符”,将两侧推开。冒号:
是更强的分隔符,三个点.:
或:.
更强,但小于::
,依此类推。
我想知道我们如何为上述语言编写语法然后解析它?此外,虽然这种表示法已经过时,但我发现它在程序员的眼中看起来非常清晰。那么它的优缺点是什么?