【问题标题】:Cadr of a list involving assoc function涉及关联函数的列表的cadr
【发布时间】:2014-05-31 05:32:35
【问题描述】:

我在网上环顾四周,找不到我的问题的答案。 如果有人能在不降低这篇文章评分的情况下提供一个好的答案,我将不胜感激。

在 Lisp 中,carcdr 用于像 '(whatever here) 这样的数据模式,这对我来说很有意义。

现在,在 Land of Lisp 一书中,作者正在解释如何构建文本引擎,突然他使用以下描述来制作函数。

(defun describe-location (location nodes)
  (cadr (assoc location nodes)))

我能问一下他为什么要在列表上做 cadr 吗?为什么它会提供响应而不是错误?它不应该是一种数据模式,即在左括号'(whatever here)前有一个引号吗?

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

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

非常感谢!

【问题讨论】:

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


    【解决方案1】:

    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 表达式返回相同的结果。

    【讨论】:

      【解决方案2】:

      我记得这本书,很有趣。

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

      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*)
      

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

      【讨论】:

      • 我将书中的(defparameter *nodes* ...) 复制到了我的repl 中,然后复制了(assoc 'garden *nodes*),它成功了,检查你的代码,祝你好运!
      猜你喜欢
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多