lisp - 如何在 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 = (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/

相关文章:

scheme - 为什么 Lisp 文件不是语句列表?

lambda - 如何在保留捕获的变量的同时更改 lambda 中的代码?

lisp - clip正数创始人

list - 使用List将字符串定义为字符列表并编写递归函数返回字符串的长度

common-lisp - 在宏中构建符号时处理可读的情况

Lisp - 从对列表中删除实例

lisp - SBCL "subst"效率

Scheme 函数从 x 上下写数字

list - 检查列表中是否有一定数量的元素

function - 关于在函数和宏定义中使用结构文字