gpt4 book ai didi

io - 用 lisp 将列表写入文件

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

(defun foo (mylist)
(with-open-file (str "out.txt"
:direction :output
:if-exists :append
:if-does-not-exist :create)
(if mylist
(progn
(format str (car mylist))
(foo (cdr mylist))))))

我有两个问题。第一个是我不能用这个表达式 (format str (car mylist)) 写一个列表的元素,其次它会产生另一个错误,如下所示。

             already points to file
"out.txt", opening the file again for :OUTPUT may produce
unexpected results
Open the file anyway

最佳答案

错误

此错误记录在 the manual 中.您正在递归调用 foo 并且每次调用都会再次打开文件。这可能会产生非常糟糕的后果。

重新打开

您可以通过将递归调用移到 with-open-file 之外来修复它:

(defun write-list-to-file-reopen (mylist destination)
(when mylist
(with-open-file (str destination
:direction :output
:if-exists :append
:if-does-not-exist :create)
(prin1 (pop mylist) str)
(terpri str))
(write-list-to-file-reopen mylist)))

但这效率很低,因为 open是一个相对昂贵的操作。

更好的解决方案是迭代

(defun write-list-to-file-iterate (mylist destination)
(with-open-file (str destination
:direction :output
:if-exists :append
:if-does-not-exist :create)
(dolist (el mylist)
(format str "~S~%" el))))

或者,如果您需要使用递归,

(defun write-list-to-file-recursion (mylist destination)
(with-open-file (str destination
:direction :output
:if-exists :append
:if-does-not-exist :create)
(labels ((write-list (list)
(when list
(prin1 (pop list) str)
(terpri str)
(write-list list))))
(write-list mylist))))

格式

函数format是相对的重量很重,用于交互式 pretty-print ,你可能更喜欢使用更简单的函数,如 write .

你的问题是因为你的(format str x)应该是(format str "~S~%"x):你忘了 format string .

关于io - 用 lisp 将列表写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997900/

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