问题是:我列出了这样的列表:
(((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)))
的每个子列表打印到不同的行。
答案 0 :(得分:2)
我想你可以在with-open-file
的主体内使用labels
创建一个帮助函数,这样它就可以访问流。
(with-open-file (stream path :direction :output)
(labels ((recursive-print (lst)
...)
(flatten (lst acc)
...)
...)
(recursive-print lst))))
由于这看起来像家庭作业,我将不再详述,但是使用标签分隔几个功能,例如flatten
,print-lines
和print-elements
会使代码更容易阅读和改变。