Lisp 用外行术语解释打开文件

Lisp 用外行术语解释打开文件,lisp,common-lisp,Lisp,Common Lisp,我在学习CL,而且我在其他语言方面的经验很少。有没有人能用外行的语言向我解释一下这意味着什么,特别是这里的“out”代表什么,以及它们是如何结合在一起的: (defun save-db (filename) (with-open-file (out filename :direction :output :if-exists :supersede) (with-standard-io-syntax

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

(defun save-db (filename)
  (with-open-file (out filename
                   :direction :output
                   :if-exists :supersede)
    (with-standard-io-syntax
      (print *db* out))))
大多数情况下,我不明白的是“出局”,但对整个事情的解释会很好


感谢

out是绑定到打开文件的流变量。 使用“打开文件”可确保文件在作用域内打开并关闭
在范围之外,无论您如何退出。

作为ddyer的补充,您也可以使用
MACROEXPAND
MACROEXPAND-1
来查看
与-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


因此,当我们关闭流时,如果出现问题,G748将是
T
,因此
CLOSE
将尝试清除创建流的任何副作用。

请告诉我如何在Linux for CL上获得描述此类事情的手册页?手册页是Unix的传统,Lisp来自一种非常独特的文化。一般来说,我会在谷歌上搜索“hyperspec”+(不管我对什么术语感到好奇)。或者,在很多情况下,你可以使用Lisp的内置文档系统:
(文档“foo”函数)
将查找函数或宏的文档
foo
。遗憾的是,对于打开文件的
的特定情况,SBCL中似乎缺少这一点。