2009-11-05 75 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是「生產可讀輸出」打印機。