【问题标题】:(list ...) vs '(...) in Lisp [duplicate]Lisp 中的 (list ...) vs '(...) [重复]
【发布时间】:2016-06-19 17:43:15
【问题描述】:

当我有一个函数定义make-cd 并执行该函数以获得错误答案时。

(defun make-cd (title artist rating ripped)
  '(:title title :artist artist :rating rating :ripped ripped))

(add-record (make-cd "Roses" "Kathy Mattea" 7 t))

(:TITLE TITLE :ARTIST ARTIST :RATING RATING :RIPPED RIPPED)

我应该使用(list ...) 来获得正确答案。

(defun make-cd (title artist rating ripped)
  (list :title title :artist artist :rating rating :ripped ripped))

(add-record (make-cd "Roses" "Kathy Mattea" 7 t))

(:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T)

这是为什么?

【问题讨论】:

  • '(X Y Z)(QUOTE (X Y Z)) 的简写。 QUOTE 只是将给定对象作为文字数据返回,而不是对其进行评估。也就是说,在您的示例中,TITLEARTISTRATINGRIPPED 不是对具有这些名称的变量的引用;它们只是文字符号。
  • 这就像不插入 'this is $WYSIWYG' // => 'this is $WYSIWYG' 的常量字符串和插入 "This is not $WYSIWYG" // => "This is not replaced" 的字符串之间的区别。

标签: list lisp common-lisp evaluation quote


【解决方案1】:

Lisp 将符号作为数据结构。符号可以作为自身使用 - 作为符号 - 或作为代码中的变量。

你需要记住带引号的表达式和函数调用的求值规则:

引用表达式的计算规则:引用表达式中的任何内容都不会被计算。该值按原样返回。

函数调用的求值规则:在函数调用中,所有参数从左到右求值,并将这些结果传递给函数。正在返回函数的计算结果。

创建数据

带引号的符号:

CL-USER 13 > 'foo
FOO

引用列表。引号内的任何内容都不会被评估。

CL-USER 14 > '(foo bar)
(FOO BAR)

嵌套列表,引用。

CL-USER 15 > '((foo bar) (foo baz))
((FOO BAR) (FOO BAZ))

使用函数list 新创建的列表。内容是符号。

CL-USER 16 > (list 'foo 'bar)
(FOO BAR)

一个新创建的嵌套列表:

CL-USER 17 > (list (list 'foo 'bar) (list 'foo 'bar))
((FOO BAR) (FOO BAR))

一个新创建的列表,使用引用的列表作为内容:

CL-USER 18 > (list '(foo bar) '(foo bar))
((FOO BAR) (FOO BAR))

使用变量创建数据

使用带有两个变量的函数list

CL-USER 19 > (let ((foo 1)
                   (bar 2))
               (list foo bar))
(1 2)

使用 反引号 列表。对逗号后的元素求值。

CL-USER 20 > (let ((foo 1)
                   (bar 2))
               `(,foo ,bar))
(1 2)

使用嵌套的反引号列表。对逗号后的元素求值。

CL-USER 21 > (let ((foo 1)
                   (bar 2))
               `((,foo ,bar) (,foo ,bar)))
((1 2) (1 2))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多