2008-11-15 57 views
9

Có bất kỳ giải pháp kiên trì nào cho Common Lisp, chẳng hạn như Elephant, cho phép duy trì chức năng không? Hiện tại, ứng dụng của tôi lưu trữ số nhận dạng trên db và các tìm kiếm sau trong bảng chức năng, nhưng phương pháp này không cho phép lưu trữ các hàm được tạo động.Chức năng tồn tại trong Common Lisp

Trả lời

4

Nó không phải là một cơ chế cơ sở dữ liệu bền bỉ, nhưng hầu hết Lisps chung có một cách writing FASLs cho tất cả các loại đối tượng, kể cả các chức năng. Ví dụ:

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>) 

Bạn có thể ghi một cách trivially những byte đó và đưa chúng vào cơ sở dữ liệu nếu bạn muốn.

+1

Nhưng bạn nên lưu ý rằng nó không nằm trong tiêu chuẩn CL. –

1

Chức năng là các đối tượng mờ, vì vậy bạn sẽ không có nhiều may mắn khi lưu trữ chúng trong các tệp hoặc nội dung tương tự. Tuy nhiên, bạn có thể lưu trữ danh sách và compile chúng khi truy xuất từ ​​cơ sở dữ liệu.

Điều này sẽ không giúp bạn lưu trữ bao đóng, tất nhiên. Điều đó sẽ đòi hỏi phải lưu trữ môi trường từ vựng cùng với mã, không phải trong đó bạn có quyền truy cập (di động). Mã mà bạn biên dịch từ danh sách được lưu trữ sẽ phải dựa hoàn toàn vào dữ liệu toàn cầu hoặc dữ liệu được lưu trữ trong cơ sở dữ liệu.

Nhân tiện, hãy lưu ý rằng bạn có thể funcall biểu tượng, do đó bạn không cần bảng chức năng cho các chức năng chung.

1

Bạn có thể xem xét lưu hình ảnh Lisp. Điều này cho phép tiết kiệm "đủ thông tin để khởi động lại quá trình Lisp sau đó". Bạn có thể lưu các chức năng của mình sau khi đã tải chúng vào ảnh.

này cũng có thể là một chút tiến bộ hơn những gì bạn đang tìm kiếm, nhưng đây là một (rất) giới thiệu ngắn gọn quy trình: Saving a Core Image

2

Common Cold có thể là những gì bạn muốn. Nó bao gồm đóng cửa nối tiếp và tiếp tục nối tiếp.

3

Pascal Bourguignon đã cho số standard solution on comp.lang.lisp. Về cơ bản, bạn phải viết biểu mẫu nguồn vào một tệp và COMPILE nó sau đó LOAD nó.

(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))) 

Sau đó, bạn sẽ phải đọc tệp và lưu trữ trong cơ sở dữ liệu của mình. Để lấy lại nó, bạn cần phải lấy nó từ cơ sở dữ liệu và viết nó vào một tệp trước khi tải nó.

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

Hãy cẩn thận khi lưu trữ mã có thể không tốt. Các nhà phát triển Zope đã học được nó một cách khó khăn.

+1

Điều đó nghĩa là gì? Một chút thông hiểu hơn sẽ hữu ích hơn nhiều ... – AticusFinch