2008-11-15 5 views
9

Elephant와 같은 Common Lisp에 대한 지속성 솔루션을 통해 함수 지속성을 유지할 수 있습니까? 현재 내 응용 프로그램은 db에 식별자를 저장하고 나중에 함수 테이블에서 검색하지만이 메서드는 동적으로 생성 된 함수를 저장할 수 없습니다.Common Lisp의 함수 지속성

답변

4

그것은 데이터베이스 지속성 메커니즘 아니지만, 가장 일반적인 Lisps가 있습니다

이 또한 여기 당신이 찾고 있던 것보다 좀 더 진보 할 수 있지만,이 과정에 (매우) 간단한 소개 방법을 포함한 모든 종류의 개체에 대한 writing FASLs. 예를 들어 :

cl-user(1): (compile (defun hello() (format t "~&Hello~%"))) 
hello 
nil 
nil 
cl-user(2): (excl:fasl-write (symbol-function 'hello) "/tmp/hello.fasl") 
t 
cl-user(3): (excl:fasl-read "/tmp/hello.fasl") 
(#<Function hello @ #x1000a964d2>) 

당신은 스트림 (여기에 내가 편의를 위해 파일을 사용)에 기록 할 수있는, 그래서 당신은 하찮게 그 바이트를 캡처하고 당신이 원한다면 데이터베이스로 물건 수 있습니다.

+1

하지만 CL 표준에 포함되어 있지 않습니다. –

1

함수는 불투명 한 객체이므로 파일이나 그 안에 뭔가를 저장하는 것이별로 도움이되지 않습니다. 그러나 목록을 저장할 수 있으며 데이터베이스에서 검색시 compile을 저장할 수 있습니다.

물론 이것은 클로저를 저장하는 데 도움이되지 않습니다. 그렇게하면 코드와 함께 어휘 환경을 저장해야하며 어느쪽에도 (휴대용) 액세스 권한이 없습니다. 저장된 목록에서 컴파일하는 코드는 전체 데이터 또는 데이터베이스에 저장된 데이터에 전적으로 의존해야합니다.

그런데 funcall 심볼을 사용할 수 있으므로 전역 함수에 대한 함수 테이블이 필요하지 않습니다.

1

Lisp 이미지를 저장할 수 있습니다. 이렇게하면 "나중에 Lisp 프로세스를 다시 시작할 수있는 충분한 정보를 저장할 수 있습니다." 이미지를 이미지에로드 한 후 함수를 저장할 수 있습니다. Saving a Core Image

2

Common Cold을 원할 수도 있습니다. 직렬화 가능 클로저와 직렬화 가능 연속을 포함합니다.

3

파스칼 부르 기뇽 (Pascal Bourguignon)은 standard solution on comp.lang.lisp을 주었다. 기본적으로 소스 양식을 파일에 작성해야하고 COMPILE 다음에 LOAD입니다.

(defvar *anon*) 

(defun save-anonymous-function (fname args body) 
    (let ((fname (make-pathname :type "LISP" :case :common :defaults fname))) 
    (with-open-file (src fname :direction :output 
        :if-does-not-exist :create :if-exists :supersede) 
     (print `(defparameter *anon* (lambda ,args ,body)) src)) 
    (compile-file fname))) 

그런 다음 파일을 읽고 데이터베이스에 저장해야합니다. 다시 가져 오려면 데이터베이스에서 파일을 가져 와서 파일에로드해야합니다.

(defun load-anonymous-function (fname) 
    (let ((*load-verbose* nil) 
     (*anon* nil)) ; to avoid modifying the global one. 
    (load fname) 
    *anon*)) 
0

코드를 저장하는 것이 좋지 않을 수 있습니다. Zope 개발자는 어려운 방법을 알게되었습니다.

+1

그게 무슨 뜻입니까? 더 자세한 설명이 훨씬 더 유용 할 것입니다 ... – AticusFinch