如果您使用宏定義您的動物類,那麼您可以讓宏記錄源代碼。
實施例(在LispWorks作品):
我們可以使用ALIST例如源代碼存儲在一個類分配的時隙。 或者,你可以只使用一個簡單的全局變量。
(defclass animal()
((source :allocation :class :initform nil)))
上面有一個插槽,它應該指向類名和源代碼的列表。
(defmacro def-animal-class (&whole code name feeding)
`(progn
(defclass ,name (animal)())
(defmethod feed ((animal ,name)) ,@feeding)
(let ((item (assoc ',name
(slot-value (class-prototype (find-class 'animal))
'source))))
(if item
(setf (cdr item) ',code)
(setf (slot-value (class-prototype (find-class 'animal))
'source)
(list (cons ',name ',code)))))
',name))
生成的代碼是什麼樣的?
CL-USER > (pprint (macroexpand-1 '(def-animal-class cat ((print "feeding a cat")))))
(PROGN
(DEFCLASS CAT (ANIMAL) NIL)
(DEFMETHOD FEED ((ANIMAL CAT)) (PRINT "feeding a cat"))
(LET ((ITEM (ASSOC 'CAT (SLOT-VALUE (CLASS-PROTOTYPE (FIND-CLASS 'ANIMAL))
'SOURCE))))
(IF ITEM
(SETF (CDR ITEM) '(DEF-ANIMAL-CLASS CAT ((PRINT "feeding a cat"))))
(SETF (SLOT-VALUE (CLASS-PROTOTYPE (FIND-CLASS 'ANIMAL)) 'SOURCE)
(LIST (CONS 'CAT '(DEF-ANIMAL-CLASS CAT ((PRINT "feeding a cat"))))))))
'CAT)
使用它:
CL-USER 75 > (def-animal-class cat ((print "feeding a cat some more")))
CAT
CL-USER 76 > (cdr (first (slot-value (class-prototype (find-class 'animal))
'source)))
(DEF-ANIMAL-CLASS CAT ((PRINT "feeding a cat some more")))
因此最後的源代碼被記錄,每當一個使用宏DEF-ANIMAL-CLASS
。 然後可以例如代碼寫入文件:
(with-open-file (s "~/animals.sexp" :direction :output :if-exists :supersede)
(pprint (slot-value (class-prototype (find-class 'animal)) 'source) s))
一個簡單READ
把它帶回。
你的問題不清楚。你在這裏開發什麼樣的軟件?從它的聲音中,你正在編寫實用程序(一個宏和類的小庫)。如果是這樣的話,當圖像重新啓動時重新加載所有定義的責任被理解爲由程序員決定。如果你在REPL中定義了一些東西,並且不把它們保存到任何地方,那麼退出圖像,它們就會丟失。不僅動物的子類,而且包括一切。功能,defvars,... – Kaz
謝謝你的所有意見;這個問題是有點假設的,也許會有一點背景!我已經用Java編寫了一個解決方案,但決定看看我能否在Lisp中編寫解決方案。一旦我這樣做了,我就開始思考,如果我和一個用戶部署了這樣的一個Lisp解決方案,我將如何處理這些新的定義?我想知道是否有一些傳統的做法。 – peter