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

时间:2017-03-27 18:26:30

标签: lisp common-lisp

我有一个像这样的.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))))

1 个答案:

答案 0 :(得分:7)

  • 不要将SETQ与未声明的全局变量一起使用,请使用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))
相关问题