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

如何在LISP中读取文本文件?,lisp,common-lisp,Lisp,Common Lisp,我有一个.txt文件,如下所示: 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 我希望LISP读取文本文件并生成两个列表,第一个列表包含文本文件的前九个值,第二个列表包含接下来的九个值。像这样:List1=(012345678),List2=(012345678)。 我有以下代码: (DEFUN text() (SETQ l NIL) (LOOP (UNLESS (NULL l) (SETQ LST1 (LIST (READ l)(READ l)(R

我有一个.txt文件,如下所示:

0 
1
2
3
4
5
6
7
8
0
1
2
3
4
5
6
7
8
我希望LISP读取文本文件并生成两个列表,第一个列表包含文本文件的前九个值,第二个列表包含接下来的九个值。像这样:List1=(012345678),List2=(012345678)。 我有以下代码:

(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与未声明的全局变量一起使用,请将本地绑定与
    let
    一起使用。全局变量会使您的代码变得脆弱w.r.t.副作用,并使全局名称空间变得混乱
  • 不要一次又一次地复制粘贴或痛苦地重写相同的内容,使用循环
  • 除非必要,否则不要自己调用“打开/关闭”,更喜欢使用“打开文件”
  • 你不需要用大写字母写
两个嵌套循环 例子
这看起来不像是正确使用
循环
宏。还请注意,自从从
read
调用
read
18次以来,您已经创建了一个递归函数。。每个函数都会反复调用
read
18次……不要调用你的函数
read
,这是一个标准CL函数的名称。@Sylwester循环允许一个简单的形式(循环程序),但这里的用法不太好
(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))