【问题标题】:In Lisp is the function `1+` just syntactic sugar?在 Lisp 中,函数 `1+` 只是语法糖吗?
【发布时间】:2015-09-04 19:58:23
【问题描述】:

我刚开始学习 Lisp。首先要掌握的概念之一似乎是前缀符号(即,不要写“1 + 2”,而是写“+ 1 2”)。所以我想弄清楚为什么1+函数存在。

偏爱(+ 1 2)(1+ 2)的原因是什么?

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

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

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    通用 Lisp 语言:

    包含这些主要是为了与 MacLisp 和 Lisp Machine Lisp 兼容。一些程序员总是喜欢写 (+ x 1) 和 (- x 1) 而不是 (1+ x) 和 (1- x)。

    实际上这可以追溯到早期的 Lisp。 1962 年的 Lisp 1.5 已经有了。那里的函数被称为ADD1SUB1

    【讨论】:

      【解决方案2】:

      请记住,Common Lisp 的一部分是标准化许多已经拥有的实现。因此,如果许多实现已经具有 1+ 函数,那么包含它就足够了。 Rainer's answerwhich 实现中引用了 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 实现了add1sub1。 (另见add1 function from scheme to R5RS。)

      【讨论】:

      • 谢谢您,非常有帮助且内容丰富。我之前没有考虑过标准化部分。
      猜你喜欢
      • 2022-11-29
      • 2011-03-09
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 2011-03-08
      • 2013-11-28
      • 2014-09-18
      • 2016-07-25
      相关资源
      最近更新 更多