口齿不清的初学者我正在做“普通的口齿不清:温和的介绍”,我遇到了这种行为,我不明白这是clisp:

[57]> (cdar '((fee fi) '(fo fum)))
(FI)
[58]> (cdar '('(fee fi) '(fo fum)))
((FEE FI))

第一个表达式(第57行)对我来说很有意义它得到了((费菲)汽车的CDR,即(费菲)汽车的CDR但是58号线怎么了我本以为它会给我同样的东西但它却给了我一张单子有谁能帮我弄明白发生了什么事吗?
更令人惊讶的是,如果我用两个表达式分别执行这些操作,那么当(fee fi)未被引用时,我会得到一个错误:
[72]> (car '((fee fi) '(fo fum)))
(FEE FI)
[73]> (cdr (FEE FI))

*** - EVAL: undefined function FEE

但我得到了正确的结果,当(费fi)被引用,我的第一个结果的倒转:
[77]> (car '('(fee fi) '(fo fum)))
'(FEE FI)
[78]> (cdr '(FEE FI))
(FI)

任何启发都将不胜感激!

最佳答案

'字符只是一个缩写:'something在读取时扩展到(quote something)因此:

(cdar '('(fee fi) '(fo fum)))

实际上是:
(cdar (quote ((quote (fee fi)) (quote (fo fum)))))

第一个quote防止对其内容求值,因此其余的只是文字列表和符号,因此更有用的表示形式是:
(cdar '((quote (fee fi)) (quote (fo fum))))

然后CAR就是(quote (fee fi)),而CDR就是((fee fi))

关于lisp - 汽车和cdr的常见Lisp报价行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17395928/

10-11 15:45