Lisp, cons和number.号)的区别



(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)

在第一个版本中,您正在更改代码本身的文本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) vs. (list 1 2 3)),它们是由cons单元构建的。

来自HyperSpec:

(对象的)直接在程序中引用而不是由程序计算出来的;也就是说,作为数据出现在引用形式,或者,如果对象是一个自我评价的对象,出现作为未引用的数据。在形式(cons "one" '("two"))中,表达式"一"("两个")和"两个"文字对象。"

两者都是结构相似的对象。也就是说,它们都是cons单元格,其中2个在CAR位置,3个在CDR位置。

它们之间的主要区别是:3)是一个常量,(cons 2 3)生成一个新的cons单元格。如果按照下面的方式使用两个(看起来类似的)函数,那么它们之间的区别就很明显了:

(defun a () 
  (let ((v (cons 2 3))) 
   (incf (car v))
   v)
(defun b () 
  (let ((v '(2 . 3))) 
   (incf (car v))
   v)

相当多的实现将返回'(3)。3)"(4。

'(2 . 3)为点对。

(cons 2 3)也创建了一个点对。所以它们的值应该是一样的

一个是点对的文字,另一个创建点对

(1 . 2)cons单元格的s表达式语法。cons单元格的car为1,cdr为2。

'(1 . 2)前面加引号是(quote (1 . 2))的缩写。quote指示求值器不(!)求它所包含的表单的值,而只是原样返回它。这个带引号的形式的值就是形式本身。quote说:不求值。在Common Lisp中,这可以被认为是常量文字数据。

(cons 1 2)是一个Lisp形式,其前面有函数cons和两个参数:1和2。如果我们对这种形式求值,函数cons将被调用,参数为1和2。根据定义,cons返回一个新的cons单元格,其参数为carcdr。所以(cons 1 2)每次求值都会返回一个新的cons单元格

它们不一样,也一样。

符号quote(')是一个函数,表示:"创建这个列表而不计算这个。"示例:'(* 2 2);它将创建一个列表(* 2 2)(list (* 2);它将创建(4),因为列表是求值的。

函数cons创建关联的对,仅此而已。示例:(cons (a b c) (1 2 3));1 2 3)(cons a (1 2 3 4));create (a. 1 2 3 4)

在这种情况下,您使用的两个函数做同样的事情,但使用不同的方式来完成它。因为quote(')只是在symbol quote(')前面创建了一个列表,而cons函数只是创建了与你给函数的"items"相关联的对。

相关内容

  • 没有找到相关文章

最新更新