我刚刚开始学习LISP,并试图解决以下问题: (我已经尝试解决这个问题,直到我得到这个疑问并陷入困境)
原始清单:((b c)(r p))
在此列表上执行以下操作并输出结果:
谢谢!
答案 0 :(得分:3)
关于NIL/(NIL)
:
NIL
是一个自我评估的符号(symbol-value
本身就是其中一个符号)。所有在布尔值上运行的函数都将此符号识别为 false 。对序列或缺点单元进行操作的所有函数都将此符号识别为空列表。实际上,nil
用于其他上下文(格式等),您可以定义自己的函数,其中nil
可能意味着什么(按照惯例,它通常意味着“空”,“零“,”未定义“,......)。评估(list)
会返回nil
。
(NIL)
是一个元素的列表NIL
。
可以通过评估(cons nil nil)
或(list nil)
来获取。如果您对其应用length
,则会返回1.
当您阅读此表单时:
((b c)(r p))
...你获得了与读这个结构相同的结构:
((b . (c . nil)) . ((r . (p . nil)) . nil))
...这也与评估的结构相同:
(cons ;; CAR
(cons ;; CAAR
'b
;; CDAR
(cons 'c
nil))
;; CDR
(cons (cons 'r
(cons 'p
nil))
nil))
然后,请记住:
(CADR X) = (CAR (CDR X))
...并相应地遵循每个利弊细胞。例如:
(CDADR X) = (CDR (CAR (CDR X)))
您从里到外进行评估并对其先前的结果应用每个函数,该结果将从根元素开始相应地下降到缺点单元格的树中。
换句话说,从根元素开始,下降到CDR,获取结果的CAR,等等。我会让你这样做。结果既不是(NIL)
也不是NIL
。
答案 1 :(得分:1)
你的例子错了:
列表:((b c) (r p))
Operation your example actual result
CDR ((r p)) ((r p))
CADR r (r p)
CDADR (nil) or nil (p)