我有一个这样的 .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))))
最佳答案
- 不要将 SETQ 与未声明的 global 变量一起使用,将局部绑定(bind)与
let
一起使用。全局变量使您的代码变得脆弱 w.r.t.副作用并使全局命名空间困惑。 - 不要一遍又一遍地复制粘贴或痛苦地重写相同的东西,使用循环
- 除非必要,否则不要自己调用 open/close,最好使用
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))
关于lisp - 如何在 LISP 中读取文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43053850/