我在网上四处看看,无法找到我的查询答案。 如果有人能够在不评价这篇文章的情况下提供一个好的答案,我将非常感激。
在Lisp car
中,cdr
用于数据模式,例如'(whatever here)
,这对我来说很有意义。
现在,在 Land of Lisp 一书中,作者正在解释如何构建一个文本引擎,突然他使用以下描述来创建一个函数。
(defun describe-location (location nodes)
(cadr (assoc location nodes)))
我可以问他为什么要在列表上做一个干部,为什么它会提供回复而不是错误?它不应该是一个数据模式,在开括号'(whatever here)
前面有一个引号?
以及为什么他在(assoc location nodes)
而不是(assoc 'garden *nodes*)
使用assoc
不是第二种正确的方法吗?我可能错过了大局,因此非常感谢有人解释这些要点。
非常感谢!
答案 0 :(得分:3)
ASSOC
是一个功能。 Lisp计算其所有参数,然后使用这些值调用它。这就是Lisp中函数评估的工作原理。
(assoc 'garden *nodes*)
assoc
是一个函数。它现在将评估论点。'garden
评估为符号garden
。*nodes*
评估为变量*nodes*
的值。assoc
。现在:
(assoc location *nodes*)
assoc
是一个函数。它现在将评估论点。location
评估为变量location
的值。*nodes*
评估为变量*nodes*
的值。assoc
。例如,如果变量location
的值是符号garden
,则上面的assoc
表达式会返回相同的结果。
答案 1 :(得分:1)
我记得这本书很有趣。
assoc
只返回缺点,汽车等于给定值。它类似find
函数,参数为:key #'car
。所以,例如:
CL-USER> (assoc 'a '((a "letter a") (b "letter b") (c "letter c")))
(A "letter a")
所以既然我们到达了整个缺点,汽车满足测试,我们可以进一步申请cadr
这个缺点并获得相关价值:
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*)
但它会产生相同的效果,仅适用于花园位置。