gpt4 book ai didi

lisp - 关于保存宏/函数调用的任何提示?

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:49 24 4
gpt4 key购买 nike

前一段时间,对于一个基于动物园的小例子,我写了一个基类 ANIMAL,一些子类 CAT,MOUSE 等。一个通用方法 FEED 接受一个 ANIMAL 参数和一些专门针对每个 ANIMAL 子类型的方法.

在写完第二个和第三个类、方法对后,我意识到我在一遍又一遍地写同样的东西,于是决定写一个宏 DEF-ANIMAL-SUBCLASS,它扩展成一个 PROGN,它定义了新的子类和适当的方法.

然后我意识到我刚刚为我的用户提供了一种定义他们自己的 ANIMAL 子类型的方法,他们可能会觉得有用!然而,虽然他们可能只是在运行图像中这样做,但我没有办法保存他们的新 ANIMAL 类型,因此,在图像重新启动的情况下,将为他们重新创建任何新的 ANIMAL 类型(他们无需重新评估宏)。

有传统的方法吗?

是不是不该做的事?

如有任何提示,我们将不胜感激!

干杯,

P

最佳答案

如果你用宏定义你的动物类,那么你可以让宏记录源代码。

示例(适用于 LispWorks):

例如,我们可以使用列表将源代码存储在类分配的插槽中。或者,您可以只使用一个简单的全局变量。

(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 就可以把它带回来。

关于lisp - 关于保存宏/函数调用的任何提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10621436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com