クラス内でファイル アクセスを処理する 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)))
「コンストラクタ」(つまり、initialize-instance) で、私の C++ イディオムと同じようにファイルを開きます。その後、データにアクセスできるようになり、以前と同じようにデータを解析できます。ただし、「デストラクタ」または(ファイナライズ)メソッドを使用してファイルを閉じることは、データファイルの外部にアクセスできるようにファイルが必要なこの種の状況を処理するための慣用的なCLOSではないと言われていますメソッド。
データ ファイルをロードし、そのデータを使用して一連の分析を実行し、できればファイルを閉じる関数を定義します。これを行う方法は何ですか?(私は、マクロまたは何らかのタイプのクロージャがここで機能すると想定していますが、何が必要か、またはそれをどのように実装するかを決定する Lisp の方法に十分に精通していません)。