【问题标题】:How do I read a text file in LISP?如何在 LISP 中读取文本文件?
【发布时间】:2017-03-27 18:26:30
【问题描述】:

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

【问题讨论】:

  • 这看起来不像是正确使用 loop 宏。另请注意,您已经创建了一个递归函数,因为您从 read 调用了 18 次 read.. 他们每个人都会一次又一次地调用 read 18 次.....
  • 不要调用你的函数read,这是标准 CL 函数的名称。
  • @Sylwester Loop 承认一个简单的形式(循环 progn),但这里的用法并不漂亮

标签: lisp common-lisp


【解决方案1】:
  • 不要将 SETQ 与未声明的 全局 变量一起使用,将本地绑定与 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))

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 2012-11-22
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多