gpt4 book ai didi

Lisp, cons 和 (number . number) 区别

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:08 25 4
gpt4 key购买 nike

有什么区别

(cons 2  3)

'(2 . 3)

在 Lisp 中?

最佳答案

它们并不完全相同,即使它们在 REPL 中的计算结果相同。考虑这些示例,其中 cons 单元被破坏性地修改:

TEST> (defun literal-cons ()
(let ((cons '(1 . 2)))
(incf (cdr cons))
cons))
LITERAL-CONS
TEST> (literal-cons)
(1 . 3)
TEST> (literal-cons)
(1 . 4)
TEST> (literal-cons)
(1 . 5)

与此相比:

TEST> (defun non-literal-cons ()
(let ((cons (cons 1 2)))
(incf (cdr cons))
cons))
NON-LITERAL-CONS
TEST> (non-literal-cons)
(1 . 3)
TEST> (non-literal-cons)
(1 . 3)

在第一个版本中,您正在更改 literal代码本身中的 cons 单元(因此,这是自修改代码)。在第二个版本中,cons 单元格不是文字。每次调用代码时都会生成它,并且只会更改这个新的 cons 单元。

TEST> (function-lambda-expression #'literal-cons)
(LAMBDA NIL
(DECLARE (CCL::GLOBAL-FUNCTION-NAME LITERAL-CONS))
(BLOCK LITERAL-CONS (LET ((CONS '(1 . 5))) (INCF (CDR CONS)) CONS))) ;; notice the '(1 . 5)
NIL
LITERAL-CONS

由于在使用破坏性操作时这会导致细微的错误,因此在代码中应小心处理此类文字对象。这也会影响列表文字('(1 2 3)(list 1 2 3)),它们是从 cons 单元构建的。

来自HyperSpec :

literal adj. (of an object) referenced directly in a program rather than being computed by the program; that is, appearing as data in a quote form, or, if the object is a self-evaluating object, appearing as unquoted data. ``In the form (cons "one" '("two")), the expressions "one", ("two"), and "two" are literal objects.''

关于Lisp, cons 和 (number . number) 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6865142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com