使用Lisp重新打印列表

时间:2009-11-05 05:04:17

标签: lisp common-lisp

我有一个小而有趣的问题,但我不能找到一个完美的解决方案,如果你能帮助我或给我一个暗示,我将不胜感激。 问题是:

给出任何列表,比如'(a b c),我们会将其转换为'[a b c] 或'(a(b c)),我们将转换为'[A [B C]]

换句话说,该函数应该与LISP中的PRINT做同样的事情,除了我们将括号更改为方括号。但是简单地打印到字符串然后将括号替换为方括号的方法不计算。 请给我一些想法,谢谢。

2 个答案:

答案 0 :(得分:2)

这是我的看法:

(defun bprint (object)
  (typecase object
    (cons
     (write-char #\[)
     (do ((list object (rest list)))
         ((endp list) (write-char #\]))
       (bprint (first list))
       (when (rest list)
         (write-char #\Space))))
    (t
     (prin1 object)))
  t)

即:遇到列表时,打印左括号,递归打印内容,必要时在对象后添加空格,然后打印结束括号。使用prin1打印所有非列表对象。 prin1是“生产可读输出”打印机。

答案 1 :(得分:0)

这是一本好书:Practical Common Lisp

如果您赶时间,可能需要从这里开始:List ProcessingFormat Recipes