Concatenative languages 有一些非常有趣的特性,例如能够组合不同数量的函数以及能够分解出函数的任何部分。然而,许多人因为它们使用后缀表示法并且难以阅读而忽略它们。另外,波兰人可能不欣赏人们反向使用他们精心制作的符号。
那么,是否有可能有前缀符号?如果是这样,权衡是什么?
我知道它是如何工作的,但我没有使用连接语言的经验,所以我可能遗漏了一些东西。基本上,一个函数将以相反的顺序进行评估,而值将以相反的顺序从堆栈中取出。为了证明这一点,我将后缀与前缀的外观进行比较。以下是一些使用传统后缀表示法的连接表达式。
5 dup * ! Multiply 5 by itself
3 2 - ! Subtract 2 from 3
(1, 2, 3, 4, 5) [2 >] filter length ! Get the number of integers from 1 to 5
! that are greater than 2
表达式从左到右计算:在第一个示例中,5
被压入堆栈,然后 dup
复制堆栈顶部的值,然后 *
将堆栈顶部的两个值相乘。函数首先从堆栈中取出最后一个参数:在第二个示例中,当调用 -
时,2
位于堆栈顶部,但它是最后一个参数。这是我认为前缀符号的样子:
* dup 5
- 3 2
length filter (1, 2, 3, 4, 5) [< 2]
表达式从右到左计算,函数首先从堆栈中取出它们的第一个参数。请注意前缀过滤器示例如何与其描述更接近,并且看起来与应用样式相似。我注意到的一个问题是,将事情分解出来可能没有那么有用。例如,在后缀表示法中,您可以从 2 -
中分解出 3 2 -
以创建一个减法函数。在前缀表示法中,您可以从 - 3
中提取出 - 3 2
以创建一个消减函数,这似乎没什么用。除非有任何明显的问题,否则使用前缀符号的连接语言可能会赢得不喜欢后缀符号的人。任何见解表示赞赏。
最佳答案
好吧,当然,如果你的词仍然是固定的,那么这只是从右到左执行标记的问题。
只是因为 n-arity 函数前缀表示法隐含括号,并且只是因为希望人类“阅读顺序”匹配执行顺序,作为堆栈语言隐含后缀。
关于programming-languages - 连接语言可以使用前缀表示法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9541468/