Concatenative languages有一些非常有趣的特征,比如能够组合不同元素的函数并能够分解函数的任何部分。但是,许多人因为使用了后缀符号而忽视了它们,并且它很难阅读。此外,波兰人可能不赞赏使用他们精心制作的符号的人倒退。连接语言是否可以使用前缀符号?
那么,是否有可能有前缀符号?如果是这样,那么权衡是什么?
我对它是如何工作有一个想法,但我没有使用连接语言的经验,所以我可能错过了一些东西。基本上,一个函数将以相反的顺序进行评估,并且将以相反的顺序从堆栈中抽取值。为了演示这一点,我将比较postfix和前缀的样子。这里有一些与传统的后缀表示法连接的表达式。
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]
的计算公式是从右到左评估,功能先拉自己的第一个参数从栈中。请注意前缀过滤器示例如何更接近其描述,并且看起来与应用风格类似。我注意到的一个问题是将因素考虑在内可能没有那么有用。例如,在后缀表示法中,您可以从3 2 -
中分解出2 -
以创建subtractTwo函数。在前缀表示法中,可以从- 3 2
中分解出- 3
以创建subtractFromThree函数,这看起来没有用处。
除了任何明显的问题,也许使用前缀符号的连接语言可能会赢得不喜欢后缀符号的人。任何见解都会被赞赏。
组成在后缀表示法中看起来更好,您可以按照数据流的顺序编写它。这感觉不自然和尴尬 - 既不适用也不串连。 – 2012-03-02 23:12:31
但是对于习惯于看到一个函数名称后跟其参数的人来说,这种风格是不是更吸引人?该过滤器示例看起来与其Haskell相似,除了它不需要任何时髦的组合运算符或括号。谓词很尴尬,但也许有办法让它看起来更好。 – 2012-03-03 00:30:56
这是一个范例开关,总有你需要习惯的东西。功能vs命令也是一样 - 来自后者的人将被用于变量可变和动作总是顺序发生,但这不是改变函数式语言基本属性的论据。切换到concatenative后,postfix感觉很自然。 – 2012-03-03 00:55:14