gpt4 book ai didi

list - 如何将文件中的列表添加到 Lisp

转载 作者:太空宇宙 更新时间:2023-11-03 19:02:06 27 4
gpt4 key购买 nike

我想将文本文件中的列表添加到 lisp 并将其绑定(bind)到某个变量。例如 Mylist.txt 包含: ((1 2 3 4) (5 6 7 8) (9 10 11 12) (13 14 15 16) )我想从这个文件中读取并将这个列表设置为某个变量 mylist。

    (defun readfile (fileName) (let ((in (open fileName :if-does-not-exist nil)))
(when in
(loop for line = (read in nil)

while line do (print line))
(close in)
)
) )


(setf myList (readfile "list.txt"))

输出应该是(myList 应该绑定(bind)到): ((1 2 3 4) (5 6 7 8) (9 10 11 12) (13 14 15 16) )

我已经在 stackflow 上看到了关于这个的大部分答案,但是没有他们工作,例如我试着逐行阅读它并使用了 collect 但是这似乎没有给我正确的答案,因为它收集了整行并将其视为列表项。

最佳答案

到目前为止,您正在读取文件并将其打印到标准输出((print line) statement in READFILE)。相反,您想收集输入。

(defun read-file (file-name)
(let ((*read-eval* nil))
(with-open-file (in file-name)
(loop for x = #1=(read-line in nil :eof) then #1#
until (eq x :eof)
collect (read-from-string x)))))

逐行:1. 请使用 CL 命名约定。2. 在 read macros 存在的情况下,从字符串/文件中读取是危险的.将 *READ-EVAL* 设置为 NIL 会阻止它们的执行。3、我们要做的阅读很简单。使用 WITH-OPEN-FILE 提供了一个简单而安全的界面(例如,如果出现条件(异常),它将正确关闭文件)。 IN 是与文件关联的输入流的名称。4. 在 LOOP 中,每次迭代读取一行。这里我假设每一行都是一个合适的 Lisp 表达式(例如,一个数字或一个列表)。如果您的表达式跨越多行,则需要进行更改。 #1= 让您记住它后面的表单,然后 #1# 插入该表单。这用于避免重复 (READ-LINE ...) 形式的 initial 和 then 语句。 READ-LINE 指示在到达文件末尾时不抛出错误,而是返回 :EOF。5. 直到到达文件末尾...6. 读取(从字符串转换为 Lisp 数据)并收集从文件中读取的行。

此函数返回文件的(读入 Lisp 数据)行列表。例如,如果“text.txt”包含

((1 2 3) (4 5 6))
(a b c)
(:f :g :h)

“test.txt”的 READ-FILE 将导致:

CL-USER> (read-file "test.txt")
(((1 2 3) (4 5 6)) (A B C) (:F :G :H))

最后,不要使用 SETF,除非 MY-LIST 是使用 DEFVARDEFPARAMETER 定义的(其中如果它应该被命名为 *MY-LIST*) 或者如果它是使用 LET 在本地定义的。

关于list - 如何将文件中的列表添加到 Lisp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35672743/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com