【发布时间】:2015-09-04 19:58:23
【问题描述】:
我刚开始学习 Lisp。首先要掌握的概念之一似乎是前缀符号(即,不要写“1 + 2”,而是写“+ 1 2”)。所以我想弄清楚为什么1+函数存在。
偏爱(+ 1 2)或(1+ 2)的原因是什么?
它只是语法糖吗?是为了代码优化吗?是为了可读性吗?
也许有更复杂的函数调用示例来说明1+ 函数存在的原因。任何见解将不胜感激。
【问题讨论】:
标签: lisp common-lisp
我刚开始学习 Lisp。首先要掌握的概念之一似乎是前缀符号(即,不要写“1 + 2”,而是写“+ 1 2”)。所以我想弄清楚为什么1+函数存在。
偏爱(+ 1 2)或(1+ 2)的原因是什么?
它只是语法糖吗?是为了代码优化吗?是为了可读性吗?
也许有更复杂的函数调用示例来说明1+ 函数存在的原因。任何见解将不胜感激。
【问题讨论】:
标签: lisp common-lisp
通用 Lisp 语言:
包含这些主要是为了与 MacLisp 和 Lisp Machine Lisp 兼容。一些程序员总是喜欢写 (+ x 1) 和 (- x 1) 而不是 (1+ x) 和 (1- x)。
实际上这可以追溯到早期的 Lisp。 1962 年的 Lisp 1.5 已经有了。那里的函数被称为ADD1 和SUB1。
【讨论】:
请记住,Common Lisp 的一部分是标准化许多已经拥有的实现。因此,如果许多实现已经具有 1+ 函数,那么包含它就足够了。 Rainer's answer 在 which 实现中引用了 CLtL2(MacLisp 和 Lisp Machine Lisp)。但是为什么这些实现一开始就拥有它呢?它在循环中很有用,例如
(do ((x 0 (1+ x)))
((= x 10))
; ...
)
这也是 (+ x 1) 也可以的地方。但是在很多情况下,间接调用这种函数很方便,而且 (mapcar '1+ …) 比 (mapcar (lambda (x) (+ 1 x)) …)。
但仅此而已。对某事物加一(或减一;还有 1-)是一种非常常见的操作,因此有一个函数可以很方便地做到这一点。如果有硬件支持,它也可能是实现可以优化的东西。 (尽管the documentation 确实注意到“鼓励实现者使 [(1+ number) 和 (+ 1 number)] 的性能相同。”)由于这些函数可用且被广泛使用,因此它们是一个非常表明意图的好方法。例如,当您打算写 (+ 2 x) 时,您可以打错字并写 (+ 1 x),但您想要添加两个的可能性要小得多如果你真的写了 (1+ x)。这些函数在 Common Lisp 中是惯用的(例如,参见 How do I increment or decrement a number in Common Lisp?)。 Emacs Lisp 还有includes 1+ and 1-。
如果没有它,该语言不会受到太大影响,但它会被许多不同的人多次重新实现。例如,Racket 实现了add1 和sub1。 (另见add1 function from scheme to R5RS。)
【讨论】: