在Lisp中,函数`1 +`只是语法糖?

Jer*_*ter 4 lisp common-lisp

我刚开始学习Lisp.要掌握的第一个概念之一似乎是前缀表示法(即不是写"1 + 2",而是写"+ 1 2").所以我试图找出1+函数存在的原因.

更喜欢(+ 1 2)或者是什么理由(1+ 2)

它只是语法糖吗?是代码优化吗?是为了可读性吗?

也许有更复杂的函数调用示例来说明1+函数存在的原因.任何见解将不胜感激.

Rai*_*wig 12

Common Lisp语言:

这些主要包括与MacLisp和Lisp Machine Lisp的兼容性.一些程序员更喜欢写(+ x 1)和( - x 1)而不是(1+ x)和(1-x).

实际上这可以追溯到早期的Lisp.1962年的Lisp 1.5已经有了它.那里的功能被称为ADD1SUB1.


Jos*_*lor 9

请记住Common Lisp的一部分正在标准化许多实现已经拥有的内容.因此,如果许多实现已经具有1+功能,那么这可能足以包含它. 雷纳的回答引用CLtL2在其中实现了它(MacLisp和Lisp机器Lisp的).但是为什么这些实现首先会有它?它在循环中很有用,例如,

(do ((x 0 (1+ x)))
    ((= x 10))
  ; ...
  )
Run Code Online (Sandbox Code Playgroud)

那个地方(+ x 1)本来也没问题.但是有很多情况下间接调用这种函数很方便,而且(mapcar'1 + ...)(mapcar(lambda(x)(+ 1 x))...更容易.

但那真的是关于它的.添加一个(或减去一个;还有1-一个)就是这样一个常见的操作,它有一个功能来实现它.如果有硬件支持,它也可能是实现可以优化的东西.(虽然文档确实注意到"鼓励实现者使[(1+数字)和(+ 1数字)]的性能相同.")由于这些功能可用并且被广泛使用,它们是非常好的表明意图的方式.例如,当你打算写(+ 2 x)时,你可能会输入拼写错误并写入(+ 1 x),但如果你真的写了(1 + x),那么你想要添加两个的可能性要小得多.这些函数在Common Lisp中是惯用的(例如,请参阅如何在Common Lisp中递增或递减数字?).Emacs Lisp还包括1+和1-.

如果不存在语言,语言不会受到很大影响,但许多不同的人会多次重新实现.例如,Racket实现了add1sub1.(另请参阅从方案到R5RS的add1函数.)