包含关联功能的列表的Cadr

时间:2014-05-31 05:32:35

标签: lisp common-lisp land-of-lisp

我在网上四处看看,无法找到我的查询答案。 如果有人能够在不评价这篇文章的情况下提供一个好的答案,我将非常感激。

在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

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

非常感谢!

2 个答案:

答案 0 :(得分:3)

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

(assoc 'garden *nodes*)
  • Lisp看到assoc是一个函数。它现在将评估论点。
  • Lisp将'garden评估为符号garden
  • Lisp将*nodes*评估为变量*nodes*的值。
  • Lisp使用这些值调用assoc

现在:

(assoc location *nodes*)
  • Lisp看到assoc是一个函数。它现在将评估论点。
  • Lisp将location评估为变量location的值。
  • Lisp将*nodes*评估为变量*nodes*的值。
  • Lisp使用这些值调用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*)

但它会产生相同的效果,仅适用于花园位置。