Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List (列表…)vs';Lisp中的(…)_List_Lisp_Common Lisp_Evaluation_Quote - Fatal编程技术网

List (列表…)vs';Lisp中的(…)

List (列表…)vs';Lisp中的(…),list,lisp,common-lisp,evaluation,quote,List,Lisp,Common Lisp,Evaluation,Quote,当我有一个函数定义制作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) 我

当我有一个函数定义
制作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)
我应该使用
(列表…
)来获得正确答案

(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 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))
带引号的嵌套列表

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 14 > '(foo bar)
(FOO BAR)
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))
使用嵌套的反引号列表。将计算逗号后的元素

CL-USER 14 > '(foo bar)
(FOO BAR)
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))

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

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

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

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

创建数据

引用的符号:

CL-USER 13 > 'foo
FOO
引用的名单。报价中没有任何内容被评估

CL-USER 14 > '(foo bar)
(FOO BAR)
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))
带引号的嵌套列表

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 14 > '(foo bar)
(FOO BAR)
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))
使用嵌套的反引号列表。将计算逗号后的元素

CL-USER 14 > '(foo bar)
(FOO BAR)
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))

”(X Y Z)
(QUOTE(X Y Z))
的缩写。简单地将给定对象作为文本数据返回,而不是对其求值。也就是说,在您的示例中,
TITLE
ARTIST
RATING
rapped
不是对具有这些名称的变量的引用;它们只是文字符号。这就像不插入
“这是$WYSIWYG”/=>“这是$WYSIWYG”
的常量字符串和插入
“这不是$WYSIWYG”/=>”这不是替换的“
”(X Y Z)
(引用(X Y Z))
的缩写。简单地将给定对象作为文本数据返回,而不是对其求值。也就是说,在您的示例中,
TITLE
ARTIST
RATING
rapped
不是对具有这些名称的变量的引用;它们只是文字符号。这就像不插入
“这是$WYSIWYG”/=>“这是$WYSIWYG”
的常量字符串和插入
“这不是$WYSIWYG”/=>”这是不替换的字符串之间的区别“