我理解处理类中的文件访问的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。

我不知道你的数据的结构,但在类似的情况下,我做了一个分析,一大块功能,需要一个流,并返回一个记录,然后在循环内部创建一个完整的富实例在与打开文件。如果从来不需要带打开文件的扩展范围之外的流,你永远不必担心关闭它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top