(a(b。c)d)的框表示法的正确表示是什么?

时间:2018-12-31 11:16:04

标签: lisp common-lisp

我正在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)的正确表示是什么?

2 个答案:

答案 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 ...)将回答您的问题。