Max*_*Max 2 lisp common-lisp cdr
Lisp的初学者.我正在研究"Common Lisp:一个温和的介绍",我遇到了这种我不理解的行为.这是在clisp中:
[57]> (cdar '((fee fi) '(fo fum)))
(FI)
[58]> (cdar '('(fee fi) '(fo fum)))
((FEE FI))
Run Code Online (Sandbox Code Playgroud)
第一个表达式(第57行)对我来说很有意义.它获得了((费用fi)(fo fum))的CAR的CDR,即(费用fi)的CDR.但是58号线上发生了什么?我原以为它会给我完全相同的东西,(FI).但它给了我一份清单清单?谁能帮我理解发生了什么?
更令人惊讶的是,如果我用两个表达式中的每个表达式执行这些操作,当(费用fi)不加引号时,我会收到错误:
[72]> (car '((fee fi) '(fo fum)))
(FEE FI)
[73]> (cdr (FEE FI))
*** - EVAL: undefined function FEE
Run Code Online (Sandbox Code Playgroud)
但是当我引用(费用fi)时,我得到了正确的结果,这反映了我的第一个结果:
[77]> (car '('(fee fi) '(fo fum)))
'(FEE FI)
[78]> (cdr '(FEE FI))
(FI)
Run Code Online (Sandbox Code Playgroud)
任何照明将不胜感激!
该'字符只是一个缩写:'something在读取时间扩展到(quote something).因此:
(cdar '('(fee fi) '(fo fum)))
Run Code Online (Sandbox Code Playgroud)
实际上是:
(cdar (quote ((quote (fee fi)) (quote (fo fum)))))
Run Code Online (Sandbox Code Playgroud)
第一个quote阻止评估其内容,因此其余的只是文字列表和符号,因此更有用的表示形式是:
(cdar '((quote (fee fi)) (quote (fo fum))))
Run Code Online (Sandbox Code Playgroud)
那CAR就是(quote (fee fi)),而CDR那就是((fee fi)).
| 归档时间: |
|
| 查看次数: |
336 次 |
| 最近记录: |