使我的头脑围绕前缀表示法?


10

我正在阅读有关LISP的信息。

我了解前缀表示法在特定级别如何工作,但我想知道是否有任何技巧可以使它变得直观。


6
除了练习,您是什么意思?

到目前为止,用户RPL是我最喜欢的LISP风格。它甚至没有任何括号! zh.wikipedia.org/wiki/RPL_(programming_language) 我错过了使用我的HP 50g的感觉:-(
Robbie

乍一看似乎并不直观,但现在我认为它很棒,而且我大部分时间都在阅读。实际上,我们是这样说的:“……的总和,……的乘积”。 但是,它确实需要另一种阅读方式。现在,您只需将运算符应用于所有参数,而不用一行读取它们。
Mark C

前缀表示法怎么了?几乎所有语言都在使用它。函数调用几乎总是前缀。
SK-logic

并不是的; “直觉”很直观,因为您已经以超过20多年的数学惯例的形式学习了它。由于只有LISP和可能还有其他几种语言使用此约定,并且您仍将学习另一种约定,因此它几乎永远不会变得同样“直观”。而且我们在这里只讨论简单的表达式(2 + 3 ...您想如何尝试“半页”衬纸?:)
Rook

Answers:


6

从左到右以适当的动词作为口头语言来阅读它会有所帮助。例如(+ 3 2)可以是“加3和2”。在更一般的情况下,您可以说“对$ operands执行$ operation”。适用于相同的情况:“对三个和两个执行加法运算”。


你会怎么做与( = 1 2 )( > 4 2 )
维维安河

3
你会用一些反问的问题。:)等于?(什么?),“ 1和2!(
Erm

@RiceFlour(嘿,我从小就吃米粉制成的东西-我有面筋问题。)我会读到“一个等于两个吗?”或“下面等于一个吗?” 大于和小于运算符的前缀形式不是那么自然,但是我想知道在Lisp代码中使用它们的频率是多少。
Mark C

7

技巧?做什么的?

对于您来说,它还不直观,因为您的心理分析器还不习惯。如果您只是反复使用并阅读它,它将变得更好。


我还没有读其中很大一部分,但现在我认为这是美妙的。似乎我的大脑开始对括号有了几乎“触觉”的感觉。我认为这种感觉只会变得更加敏锐。
Mark C

5

您可以将其视为一种函数调用:

(operator operand1 operand2 ...)

没有什么特别的。如果您在C ++(以及许多允许它的其他语言)中重载运算符,则通常必须以这种方式定义此类函数:

MyClass operator+(MyClass const& x, MyClass const& y);

是的,这就是我的做法。如果您退后一步,然后看一下Java,C#等中的方法调用,它们实际上只是前缀符号,而括号的位置略有不同:MyMethod(arg1,arg2)。
nlawalker 2011年

4

许多语言混合使用前缀,中缀和后缀。

Lisp仅使用前缀-默认情况下。如果sin(x)从数学上是直观的,那么(sin x)就不远了。如果move(dog,home)是传统的过程调用,那么在Lisp中,它只是(将dog home移入)。

Lisp对数学没有任何例外,并且对待+,-,*和其他函数(如普通函数调用)。


2

当(最终)单击“一切都是函数调用”(或特殊形式或宏扩展,都具有“函数调用”的表面语法)时,感觉很自然。

因此,因为(= 1 2)我读到“调用1和2的数字等于比较”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.