2009-11-05 43 views
2

我有一个小而有趣的问题,但我不能提供一个完美的解决方案,我会很感激,如果你能帮我或给我一个提示。 的问题是:使用Lisp重印列表

给出任何列表

,说像 '(美国广播公司),我们将其转换为'[ABC] 或 '(A(BC)),我们将转换为'[A [BC]

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

+0

闻起来像功课。你试过什么了? –

+0

THX,罗伯特 我得到了现在的代码 (defun定义显示列表(LST) (条件 ((和 (原子LST) (没有(空LST))) (格式T “〜A” LST) ) ((空LST) (格式吨 “]” LST)) (吨 (格式吨 “[”) (显示列表(汽车LST)) (mapcar#'显示列表(butlast (cdr lst))) (format t“]”)) )) – Kevin

回答

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是“生产可读输出”打印机。