【发布时间】:2012-03-21 10:31:35
【问题描述】:
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]
表达式从右到左计算,函数首先从堆栈中拉出它们的第一个参数。请注意前缀过滤器示例如何与其描述更接近,并且看起来与应用样式相似。我注意到的一个问题是考虑因素可能没有那么有用。例如,在后缀表示法中,您可以从3 2 - 中分解出2 - 来创建一个subtractTwo 函数。在前缀表示法中,您可以从- 3 2 中分解出- 3 来创建一个subtractFromThree 函数,这似乎没什么用。
除非有任何明显的问题,否则使用前缀表示法的连接语言可能会赢得不喜欢后缀表示法的人的青睐。任何见解都值得赞赏。
【问题讨论】:
-
组合在后缀表示法中看起来更好,你按照数据流的顺序编写它。这感觉不自然和尴尬——既不适用也不连接。
-
但是对于习惯于看到函数名后跟参数的人来说,这种风格不是更吸引人吗?过滤器示例看起来与其对应的 Haskell 非常相似,只是它不需要任何时髦的组合运算符或括号。谓词很尴尬,但也许有办法让它看起来更好。
-
这是一个范式转换,总有一些事情你需要习惯。这与函数式与命令式相同——来自后者的人将习惯于变量是可变的并且动作总是按顺序发生,但这并不是改变函数式语言基本属性的论据。切换到连接后,后缀感觉很自然。
-
存在混合语言。 F# 结合了函数式、过程式和面向对象的范例。如果数据以相反的方式流动是在连接语言中使用前缀表示法的唯一大问题,那么我认为这是让那些认为后缀成为破坏交易的人享受连接语言的其他好处的好方法。那么谁知道呢?也许有一天他们会意识到数据与函数调用一起流动更有意义。
-
您写谓词
[< 2]最后而不是列表之前的任何具体原因?
标签: programming-languages postfix-notation factor-lang concatenative-language