如何在LISP中读取文本文件?

Chr*_*uez 1 lisp common-lisp

我有一个像这样的.txt文件:

0 
1
2
3
4
5
6
7
8
0
1
2
3
4
5
6
7
8
Run Code Online (Sandbox Code Playgroud)

我希望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))))
Run Code Online (Sandbox Code Playgroud)

cor*_*ump 8

  • 不要将SETQ与未声明的全局变量一起使用,使用本地绑定let.全局变量使您的代码变得脆弱,副作用和全局命名空间混乱.
  • 不要复制粘贴或反复重写相同的东西,使用循环
  • 除非必要,否则不要打开/关闭自己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))))))
Run Code Online (Sandbox Code Playgroud)

(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))
Run Code Online (Sandbox Code Playgroud)