Lisp 用外行术语解释打开文件
我在学习CL,而且我在其他语言方面的经验很少。有没有人能用外行的语言向我解释一下这意味着什么,特别是这里的“out”代表什么,以及它们是如何结合在一起的: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
(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中似乎缺少这一点。