写在文件Common Lisp

时间:2017-06-14 11:55:17

标签: lisp common-lisp

问题是:我列出了这样的列表:

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

我要把它写在一个文件中,每个列表列表中的数字都打印在这样一行:

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

......表示我可以拥有更多列表列表。我想知道如何在不使用循环并使用with-open-fileformat和递归的情况下实现此功能。在每个数字之间有一个空格或制表符,每个子列表列表都会开一个新行。 感谢

编辑:

我已设法使用此代码在同一行打印(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 个答案:

答案 0 :(得分: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会使代码更容易阅读和改变。