Lisp 中的 (list ...) 与 '(...)
(list ...) vs '(...) in Lisp
当我有一个函数定义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)
这是为什么?
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))
当我有一个函数定义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)
这是为什么?
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))