我正在Paul Graham的 ANSI Common Lisp 中进行练习。我掌握了其他人进行练习的关键,即:
http://www.shido.info/lisp/pacl2_e.html
完成第3章的练习后,我将参考该键逐个检查答案。当涉及到(a (b . c) d)
的表示形式时,我发现我无法理解Shido的答案,即:
http://www.shido.info/lisp/acl3-1d75.png
让我感到困惑的是,在他的回答d
之后没有nil
。
那么他的答案正确吗?实际上,(a (b . c) d)
的正确表示是什么?
答案 0 :(得分:7)
您可以使用sdraw program:
(load "sdraw.generic.lisp")
(sdraw '(a (b . c) d))
[*|*]--->[*|*]------->[*|*]--->NIL
| | |
v v v
A [*|*]--->C D
|
v
B
由此您可以看到您的想法是正确的。
答案 1 :(得分:0)
回答此类问题的方法是使系统为您解答。不幸的是,正确地执行此操作需要了解CL打印系统的工作原理,这并不是那么简单(实际上:我已经忘记了如何正确执行此操作!)。但是您可以编写一个无意识的函数,该函数将事物转换为字符串,并使用对象系统以适合的方式将各种事物转换为字符串。该 不适用于那些没有缺点但包含缺点的对象,但是对于简单的目的来说已经足够了:
(defgeneric thing->string (thing)
(:method ((thing t))
;; any kind of thing we don't know about gets printed like this
(format nil "~A" thing))
(:method ((thing cons))
;; conses get printed like this
(format nil "(~A . ~A)"
(thing->string (car thing))
(thing->string (cdr thing)))))
现在:(thing->string ...)
将回答您的问题。