Lisp 涉及assoc函数的列表的Cadr

Lisp 涉及assoc函数的列表的Cadr,lisp,common-lisp,land-of-lisp,Lisp,Common Lisp,Land Of Lisp,我在网上四处张望,找不到我的问题的答案。 如果有人能提供一个好的答案而不贬低这个帖子,我将不胜感激 在Lispcar中,cdr用于数据模式,如'(这里的任何内容),这对我来说很有意义 现在,在《Lisp之地》一书中,作者正在解释如何构建一个文本引擎,突然他使用下面的描述来创建一个函数 (defun describe-location (location nodes) (cadr (assoc location nodes))) 我能问一下他为什么在列表上做cadr,为什么它提供了一个响应而

我在网上四处张望,找不到我的问题的答案。 如果有人能提供一个好的答案而不贬低这个帖子,我将不胜感激

在Lisp
car
中,
cdr
用于数据模式,如
'(这里的任何内容)
,这对我来说很有意义

现在,在《Lisp之地》一书中,作者正在解释如何构建一个文本引擎,突然他使用下面的描述来创建一个函数

(defun describe-location (location nodes)
  (cadr (assoc location nodes)))
我能问一下他为什么在列表上做cadr,为什么它提供了一个响应而不是一个错误?它不应该是一种数据模式,即在开头的括号前面加上一个引号吗

还有,为什么他在
(assoc location nodes)
中使用assoc,而不是
(assoc'garden*nodes*)

第二种使用
assoc
的方法是否正确?我可能错过了大局,因此非常感谢有人解释这些要点


非常感谢

我记得那本书,很有趣

assoc
只返回cons,其car等于给定值。这就像带有参数的
:key#car
查找
函数。例如:

CL-USER> (assoc 'a '((a "letter a") (b "letter b") (c "letter c")))
(A "letter a")
因此,由于我们得到了整个cons,其中汽车满足测试要求,我们可以进一步应用
cadr
对该cons并获得相关值:

CL-USER> (cadr (assoc 'a '((a "letter a") (b "letter b") (c "letter c"))))
"letter a"
这一切都是为了可执行代码。在数据模式下,您只能获取列表,而不是表单,因此不会执行,请自己尝试:

CL-USER> '(car '(a "letter a"))
(CAR '(A "letter a"))
数据模式允许将列表存储为数据,而无需尝试执行它们。这就是为什么作者在游戏中使用数据模式来定义房间的描述,但在函数中,我们需要执行表单来获得结果

至于你问题的第二部分,这只是作者的设计。你当然可以放

(assoc 'garden *nodes*)

但它也会有同样的效果,只适用于花园位置。

我记得那本书,很有趣

assoc
只返回cons,其car等于给定值。这就像带有参数的
:key#car
查找
函数。例如:

CL-USER> (assoc 'a '((a "letter a") (b "letter b") (c "letter c")))
(A "letter a")
因此,由于我们得到了整个cons,其中汽车满足测试要求,我们可以进一步应用
cadr
对该cons并获得相关值:

CL-USER> (cadr (assoc 'a '((a "letter a") (b "letter b") (c "letter c"))))
"letter a"
这一切都是为了可执行代码。在数据模式下,您只能获取列表,而不是表单,因此不会执行,请自己尝试:

CL-USER> '(car '(a "letter a"))
(CAR '(A "letter a"))
数据模式允许将列表存储为数据,而无需尝试执行它们。这就是为什么作者在游戏中使用数据模式来定义房间的描述,但在函数中,我们需要执行表单来获得结果

至于你问题的第二部分,这只是作者的设计。你当然可以放

(assoc 'garden *nodes*)

但它将具有相同的效果,并且仅适用于花园位置。

ASSOC
是一个函数。Lisp计算所有参数,然后用这些值调用它。这就是Lisp中函数求值的工作原理

(assoc 'garden *nodes*)
  • Lisp认为
    assoc
    是一个函数。它现在将评估参数
  • Lisp将
    'garden
    计算为符号
    garden
  • Lisp将
    *节点*
    计算为变量
    *节点*
    的值
  • Lisp使用这些值调用
    assoc
现在:

  • Lisp认为
    assoc
    是一个函数。它现在将评估参数
  • Lisp将
    location
    计算为变量
    location
    的值
  • Lisp将
    *节点*
    计算为变量
    *节点*
    的值
  • Lisp使用这些值调用
    assoc

例如,如果变量
location
的值是符号
garden
,则上面的
assoc
表达式返回相同的结果。

assoc
是一个函数。Lisp计算所有参数,然后用这些值调用它。这就是Lisp中函数求值的工作原理

(assoc 'garden *nodes*)
  • Lisp认为
    assoc
    是一个函数。它现在将评估参数
  • Lisp将
    'garden
    计算为符号
    garden
  • Lisp将
    *节点*
    计算为变量
    *节点*
    的值
  • Lisp使用这些值调用
    assoc
现在:

  • Lisp认为
    assoc
    是一个函数。它现在将评估参数
  • Lisp将
    location
    计算为变量
    location
    的值
  • Lisp将
    *节点*
    计算为变量
    *节点*
    的值
  • Lisp使用这些值调用
    assoc
例如,如果变量
location
的值是符号
garden
,那么上面的
assoc
表达式返回相同的结果。

我将
(defparameter*nodes*…)
从书中复制到我的repl中,然后
(assoc'garden*nodes*)
它完成了操作,检查你的代码,祝你好运!我把书中的
(defparameter*nodes*…)
复制到我的repl中,然后
(assoc'garden*nodes*)
它成功了,检查你的代码,祝你好运!