在类LISP文件指针
-
16-09-2019 - |
题
我理解处理类中的文件访问的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 ++习语。然后,我必须对数据的访问,我可以像以前一样分析数据。不过,我听说用“析构函数”或(完成)方法关闭该文件不是惯用的CLOS处理这种类型的情况下,我需要的文件是围绕这样我就可以访问我的数据文件外方法
我要去限定加载一个数据文件,然后执行与其数据的一系列分析的功能,并且然后希望关闭它。什么是方式去这样做呢? (我假设宏或某些类型的封在这里的工作,但我不是口齿不清方式来决定需要什么或如何实现它足够熟悉了)。
解决方案
一种选择是具有流作为槽的替代文件名,然后用WITH-OPEN-FILE范围它:
(with-open-file (stream file)
(let ((foo (make-instance 'foo :stream stream)))
(frob foo)
(...other processing of foo...)))
然后,你的流将被自动关闭。
其他提示
我想我会瘦努力,使类只保存完整的权威数据(你叫什么DataStruct?)。
您并不真的需要“装+存储另一个类的”一类特殊的。另外,这种方式有my_data my_file的备份数据保存到当前的搜索位置,这似乎有点奇怪我的眼睛潜不变。
换句话说:是什么富呢?给定一个文件名,它加载数据,并给你一个DataStruct。这听起来像一个函数给我。如果您需要能够在一个线程中运行它,或者加载记录之间触发事件,一类是自然的方式来做到这一点在C ++中,但你并不需要一个类为Lisp的那些东西。
此外,请记住,你不需要为了使用泛型方法在CLOS使用DEFCLASS。
我不知道你的数据的结构,但在类似的情况下,我做了一个分析,一大块功能,需要一个流,并返回一个记录,然后在循环内部创建一个完整的富实例在与打开文件。如果从来不需要带打开文件的扩展范围之外的流,你永远不必担心关闭它。