用外行术语解释开放式文件

时间:2010-08-13 05:22:03

标签: lisp common-lisp

我正在学习CL,而且我在其他语言方面的经验很少。有人可以用外行的方式向我解释这意味着什么,特别是这里的“out”代表什么,以及它们如何组合在一起:

(defun save-db (filename)
  (with-open-file (out filename
                   :direction :output
                   :if-exists :supersede)
    (with-standard-io-syntax
      (print *db* out))))

大多数情况下,我不明白的是“out”,但对整个事情的解释会很好。

由于

2 个答案:

答案 0 :(得分:5)

out是绑定到打开文件的流变量。 with-open-file保证文件在作用域内打开并关闭 在范围之外,无论你如何离开。

答案 1 :(得分:1)

作为ddyer的补充,您还可以使用MACROEXPANDMACROEXPAND-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-PROTECTCLOSE该流,如果不是nil

#:G748变量是GENSYM ed符号(因此它是一个新的,未加工的符号)。如果写入文件没有出错,我们会将#:G748设置为nil

因此,当我们CLOSE流时,如果出现问题,#:G748将为T,那么CLOSE将尝试清除创建的所有副作用流。