我刚开始学习Lisp。要掌握的第一个概念之一似乎是前缀表示法(即代替写作" 1 + 2",写" + 1 2")。所以我想弄清楚1+
函数存在的原因。
选择(+ 1 2)
或(1+ 2)
的原因是什么?
它只是语法糖吗?是代码优化吗?这是为了可读性吗?
也许有更复杂的函数调用示例说明1+
函数存在的原因。任何见解都将不胜感激。
答案 0 :(得分:12)
Common Lisp the Language:
这些主要包括与MacLisp和Lisp Machine Lisp的兼容性。有些程序员更喜欢写(+ x 1)和( - x 1)而不是(1+ x)和(1-x)。
实际上这可以追溯到早期的Lisp。 1962年的Lisp 1.5已经有了它。这些功能称为ADD1
和SUB1
。
答案 1 :(得分:9)
请记住,Common Lisp的一部分正在标准化已有的许多实现。因此,如果许多实现已经具有 1 + 功能,那么这可能足以包含它。 Rainer's answer引用了上的实现的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+数字)和(+ 1数字)]的表现相同。")由于这些功能可用,广泛使用,它们是表明意图的一种非常好的方式。例如,当你打算写(+ 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。)