我有一个小而有趣的问题,但我不能提供一个完美的解决方案,我会很感激,如果你能帮我或给我一个提示。 的问题是:使用Lisp重印列表
给出任何列表,说像 '(美国广播公司),我们将其转换为'[ABC] 或 '(A(BC)),我们将转换为'[A [BC]
换句话说,函数应该和LISP中的PRINT做同样的事情,只是我们把括号改为方括号。但是像简单地打印到字符串然后用方括号代替括号的方法不算。 请给我一些想法,谢谢。
我有一个小而有趣的问题,但我不能提供一个完美的解决方案,我会很感激,如果你能帮我或给我一个提示。 的问题是:使用Lisp重印列表
给出任何列表,说像 '(美国广播公司),我们将其转换为'[ABC] 或 '(A(BC)),我们将转换为'[A [BC]
换句话说,函数应该和LISP中的PRINT做同样的事情,只是我们把括号改为方括号。但是像简单地打印到字符串然后用方括号代替括号的方法不算。 请给我一些想法,谢谢。
这是我的看法:
(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是“生产可读输出”打印机。
这是一本很好的书:Practical Common Lisp。
,如果你在忙乱之中,您可能希望从这里开始:List Processing和Format Recipes
闻起来像功课。你试过什么了? –
THX,罗伯特 我得到了现在的代码 (defun定义显示列表(LST) (条件 ((和 (原子LST) (没有(空LST))) (格式T “〜A” LST) ) ((空LST) (格式吨 “]” LST)) (吨 (格式吨 “[”) (显示列表(汽车LST)) (mapcar#'显示列表(butlast (cdr lst))) (format t“]”)) )) – Kevin