我正在学习CL,而且我在其他语言方面的经验很少。有人可以用外行的方式向我解释这意味着什么,特别是这里的“out”代表什么,以及它们如何组合在一起:
(defun save-db (filename)
(with-open-file (out filename
:direction :output
:if-exists :supersede)
(with-standard-io-syntax
(print *db* out))))
大多数情况下,我不明白的是“out”,但对整个事情的解释会很好。
由于
答案 0 :(得分:5)
out是绑定到打开文件的流变量。 with-open-file保证文件在作用域内打开并关闭 在范围之外,无论你如何离开。
答案 1 :(得分:1)
作为ddyer的补充,您还可以使用MACROEXPAND
或MACROEXPAND-1
查看WITH-OPEN-FILE
的内容:
(macroexpand '(with-open-file (out filename
:direction :output
:if-exists :supersede)
(with-standard-io-syntax
(print *db* out))))
告诉我们
(LET ((OUT (OPEN FILENAME :DIRECTION :OUTPUT :IF-EXISTS :SUPERSEDE)) (#:G748 T))
(UNWIND-PROTECT
(MULTIPLE-VALUE-PROG1 (PROGN (WITH-STANDARD-IO-SYNTAX (PRINT *DB* OUT)))
(SETQ #:G748 NIL))
(WHEN OUT (CLOSE OUT :ABORT #:G748))))
我们可以看到我们打开名为filename
的文件并将该打开的文件流分配给out
,然后执行某些操作。如果发生了不好的事情,UNWIND-PROTECT
会CLOSE
该流,如果不是nil
。
#:G748
变量是GENSYM
ed符号(因此它是一个新的,未加工的符号)。如果写入文件没有出错,我们会将#:G748
设置为nil
。
因此,当我们CLOSE
流时,如果出现问题,#:G748
将为T
,那么CLOSE
将尝试清除创建的所有副作用流。