클래스 내의 파일 액세스를 처리하는 CLOS 방식을 이해하는 데 문제가 있습니다. C++에서 나는이 작업을 수행 할 수있을 것입니다 : 내가 지적하고 싶은 것은 PraseData()를 여러 번 호출 할 것입니다, 매번 새로운 데이터 블록은 파일에서 구문 분석됩니다클래스의 lisp 파일 포인터
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
};
my_data가 변경됩니다.
내가 CLOS에서 같은 트릭을 수행하려고 해요 - 나는 등이 헤더 등뿐만 아니라 클래스 정의를 읽고, 파일을로드, 데이터를 분석하는 모든 일반적인 방법을 만듭니다
(defclass data-file()
((filename :initarg :filename :accessor filename)
(file :accessor file)
(frame :accessor frame)))
"생성자"(즉 initialize-instance)에서 파일을 내 C++ 관용어로 엽니 다. 그런 다음 데이터에 액세스 할 수 있으며 이전과 같이 데이터를 구문 분석 할 수 있습니다. 그러나 "destructor"또는 (finalize) 메서드를 사용하여 파일을 닫는 것이 파일을 필요로하는 이런 유형의 상황을 처리하는 관용 CLOS가 아니므로 데이터 파일 외부에서 액세스 할 수 있다고 들었습니다. 행동 양식.
데이터 파일을로드하고 데이터를 사용하여 일련의 분석을 수행 한 다음 잘하면 닫는 함수를 정의 할 것입니다. 이 일을 처리하는 방법은 무엇입니까? (매크로 나 어떤 유형의 클로저가 여기에서 작동한다고 가정하고 있지만, 필요한 부분이나 구현 방법을 결정하는 데 익숙하지 않습니다.)
(with-open-file (stream file)
(let ((foo (make-instance 'foo :stream stream)))
(frob foo)
(...other processing of foo...)))
그런 다음 스트림이 자동으로 종료됩니다
초기 새가 대답을 얻습니다. –