我有一个像这样的.txt文件:
0
1
2
3
4
5
6
7
8
0
1
2
3
4
5
6
7
8
我希望LISP读取文本文件并生成两个列表,第一个列表包含文本文件的前九个值,第二个列表包含接下来的九个值。像这样:List1 =(0 1 2 3 4 5 6 7 8),List2 =(0 1 2 3 4 5 6 7 8)。 我有这些代码:
(DEFUN text()
(SETQ l NIL)
(LOOP
(UNLESS (NULL l) (SETQ LST1 (LIST (READ l)(READ l)(READ l)(READ l)(READ l)(READ l)(READ l)(READ l)(READ l))
LST2 (LIST (READ l)(READ l)(READ l)(READ l)(READ l)(READ l)(READ l)(READ l)(READ l))
eb (LST1) em (LST2))
(CLOSE l) (RETURN (ASTAR LST1 LST2)))
(SETQ l (OPEN filename :if-does-not-exist nil))))
答案 0 :(得分:7)
let
的本地绑定。全局变量使你的代码变得脆弱w.r.t.副作用和混乱的全局命名空间。with-open-file
。(defun read-18-lines-of-integers-in-two-lists (file)
(with-open-file (in file)
(loop repeat 2
collect (loop repeat 9
collect (parse-integer (read-line in))))))
(read-18-lines-of-integers-in-two-lists #P"/tmp/test")
=> ((0 1 2 3 4 5 6 7 8) (0 1 2 3 4 5 6 7 8))