【发布时间】:2010-12-13 02:49:10
【问题描述】:
我在理解类中处理文件访问的 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 方式还不够熟悉,无法决定需要什么或如何实现它)。
【问题讨论】:
标签: lisp class-design common-lisp clos