在理解类中处理文件访问的 CLOS 方式时,我遇到了一个问题。在 C++ 中,我可以做到这一点:
class Foo {
Foo (string filename); // opens the file (my_file) requested by the filename
~Foo (); // close the file
FILE * my_file; // a persistent file-handle
DataStruct my_data; // some data
void ParseData (); // will perform some function on the file and populate my_data
DataStruct * GetData () { return &my_data; } // accessor to the data
};
我想指出的是 PraseData() 将被多次调用,每次都会从文件中解析一个新的数据块,并且 my_data 将被更改。
我正在尝试在 CLOS 中执行相同的技巧 - 创建所有通用方法来解析数据、加载文件、读取标题等,以及我拥有的类定义:
(defclass data-file ()
((filename :initarg :filename :accessor filename)
(file :accessor file)
(frame :accessor frame)))
在“构造函数”(即初始化实例)中,我打开文件就像我的 c++ 习惯用法一样。然后我可以访问数据,并且可以像以前一样解析数据。但是,有人告诉我,使用“析构函数”或(finalize)方法来关闭文件不是惯用的 CLOS 来处理这种我需要文件存在的情况,以便我可以在我的数据文件之外访问它方法。
我将定义一个加载数据文件的函数,然后对其数据执行一系列分析,然后希望将其关闭。有什么方法可以做到这一点?(我假设宏或某种类型的闭包可以在这里工作,但我对 lisp 方式不够熟悉来决定需要什么或如何实现它)。