【问题标题】:LISP car of the last element?LISP汽车的最后一个元素?
【发布时间】:2010-11-19 04:52:35
【问题描述】:

LISP 又一次难倒我了……为什么我不能得到列表中最后一个元素的值?我有一个类似这样的列表:

(setq bar '(((1 2) 3 4 5)((6 7) 8 9 10)))

现在我得到 4 的回报:

(caddar bar)

有 (5) 的返回:

(cdddar bar)

但我无法获得 5 分:

(cadddar bar)

为什么会这样——以及如何获得 5 的值?

错误:

; Warning: This function is undefined:
;   CADDDAR

Error in KERNEL:%COERCE-TO-FUNCTION:  the function CADDDAR is undefined.
[Condition of type UNDEFINED-FUNCTION]

【问题讨论】:

    标签: lisp warnings clisp


    【解决方案1】:

    未定义具有 5 个或更多 a 和 d 的函数。只有4个和更少。这种长度的函数太多了,不实用。

    你必须把它拼出来: (car (cdr (cdr (cdr (cdr (car x))))))

    【讨论】:

    • 答案是:(car (cdddar lst)).... 现在为什么这个 != cadddar,我不明白。
    • 在你的 LISP 实现的内部深处有: (defun cadr (x) ...) (defun cdar (x) ...) (defun caar (x) ...) ( defun cddr (x) ...) 对于长度为 1 到 4 的“a”和“d”的所有组合,依此类推。规范不包括长度为 5 的组合,因为它们太多了。 #'cdadr 系列函数没有什么特别之处。它们不会被解析为唯一解释。它们只是正常的功能。非常欢迎您(defun ...)一些新的来填补空白。
    【解决方案2】:

    好吧,根据错误消息,没有cadddar 函数。请记住,carcdr 是基本的列表读取函数。其他类似caddar 的函数是由一个或多个carcdr 组合而成的。也就是说,如果 caddar 等不存在,您可以仅使用 carcdr 执行列表操作,扩展功能只会让您的生活更轻松。

    因此,解决此问题的方法是使用carcdr 合成您自己的cadddar。如果不立即明白如何执行此操作,请从更简单的开始(例如,cadrcdar)并逐步构建到 cadddar

    【讨论】:

      【解决方案3】:
      (first (last (first '(((1 2) 3 4 5) ((6 7) 8 9 10)))))
      
      -> 5
      

      【讨论】:

        【解决方案4】:

        标准没有定义超过 4 个 as 和 ds 的函数,可能是因为它们有 32 个 [从那时起它变得更加混乱]。

        获取列表最后一个元素的可靠方法:last 返回最后一个 cons 单元格,所以

        (car (last list))
        

        为您提供最后一个列表元素。当然,list 也可以是 (first list) 之类的其他东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-13
          • 1970-01-01
          • 1970-01-01
          • 2017-11-28
          • 2012-04-02
          相关资源
          最近更新 更多