2017-06-14 77 views
0

的問題是:我喜歡這個列表的列表清單:寫在文件的Common Lisp

(((1 2) (3 4) (5 6)) ((7 8) (9 0))) 

我把它寫在一個文件,其中列出的每一個列表編號打印在這樣一行:

....... 
1 2 3 4 5 6 
7 8 9 0 
...... 

......意味着我可以有更多的列表清單。我想知道如何在不使用循環並使用with-open-file,format和遞歸的情況下實現這一點。每個數字之間都有一個空格或製表符,每個子列表的列表都會開始一個新行。 感謝

編輯:

我已經設法與這個代碼在同一行打印的(a b)子列表:

(defun write_pfs (filename point) 
    (with-open-file (str filename 
         :direction :output 
         :if-exists :append 
         :if-does-not-exist :create) 
    (format str (format nil "~~{~~a~~^~C~~}~T" #\Tab) point))) 


(defun write_points (filename points) 
    (mapcar #'(lambda (x) (write_point filename x)) points)) 

但後來我也沒辦法打印(((a b) (b c)) ((c d) (d e)))每個子表,以另一條線。

+1

到目前爲止您嘗試了什麼? – Renzo

回答

2

我會想象你可以在with-open-file的主體內使用labels作輔助函數,因此它可以訪問流。

(with-open-file (stream path :direction :output) 
    (labels ((recursive-print (lst) 
      ...) 
      (flatten (lst acc) 
      ...) 
      ...) 
    (recursive-print lst)))) 

因爲這看起來像功課我就不細說了更多的,但是做幾個功能與做不同的東西,像flattenprint-linesprint-elements使代碼更易於閱讀和修改標籤。