奇怪的公共lisp错误(sbcl)

奇怪的公共lisp错误(sbcl),lisp,Lisp,我有一个非常wierd-lisp错误。我正在使用sbcl,并编写了以下代码。我只是希望有人能解释一下 (setq x '((1 (x y) (1 2)) (3 (x z) (2 3)) (3 (x y) (1 2)) (4 (x y) (1 2)))) (caddadr x) 给出以下错误消息 );对#的评估已中止 然而,把它写在for中给了我我所期待的,那就是 (car (cddadr x)) (2 3) 只是想知道为什么这是诚实的。没有像caddadr这样的函数,这就是为什么 * (f

我有一个非常wierd-lisp错误。我正在使用sbcl,并编写了以下代码。我只是希望有人能解释一下

(setq x '((1 (x y) (1 2)) (3 (x z) (2 3)) (3 (x y) (1 2)) (4 (x y) (1 2))))

(caddadr x)
给出以下错误消息

);对#的评估已中止

然而,把它写在for中给了我我所期待的,那就是

(car (cddadr x))
(2 3)

只是想知道为什么这是诚实的。

没有像
caddadr
这样的函数,这就是为什么

* (fboundp 'caddadr)

NIL
* (fboundp 'cddadr)

T

您只有
CAR、CDR、CAAR、CADR、CDAR、CDDR、CAADR、CADDR、CDAAR、CDADR、CDDAR、CDDDR、CAAAR、CAAAR、CAADR、CAADR、CAADR、CADAR、CADADR、CADDR、CDAAR、CDADAR、CDDAAR、CDDADR、CDDADR、CDDDAR和CDDDDR
。请看:

我不明白情况如何。我以为你可以任意组合car和cdr?@tony:你可以任意组合
car
cdr
(如
(car(cdr(car-foo)))
),但这些方便快捷方式的数量只能是有限的,因为它们是由必须存在的符号命名的。您可以定义自己的便利函数,将“路径”作为参数(如
(cxr foo:a:d:a)
),但我相信更通用的链接操作符(我认为Clojure有
->
)会使它变得多余(如
(>foo#car#cdr#car)
.SBCL的输出非常详细,所以我很困惑您只有一行。如果我在REPL中输入您的行,它对这两行都不满意,因为
setq
不适合全局变量(使用
defparameter
defvar
)当然,接下来20行错误的本质是未定义的函数被多次提到。我只是使用setq作为一种快速输入长输入的方法,而不必再次写出它们