(列表...)vs'(...)在Lisp中

时间:2016-06-19 17:43:16

标签: list lisp common-lisp evaluation quote

当我有一个函数定义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)

这是为什么?

1 个答案:

答案 0 :(得分:4)

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