krz*_*z00 5 lisp macros common-lisp clos
我需要为(with-hooks (monster method who what) &body body)我正在编写的游戏编写一个宏.Monster是一个CLOS对象,方法,谁是字符串,什么是函数(#'表示法).宏观扩张将会产生影响
(add-hook monster method who what)
,@body
(remove-hook monster method who)
Run Code Online (Sandbox Code Playgroud)
我完全不知道如何编写这样的宏,我将不胜感激.我有一种令人毛骨悚然的感觉,这很容易,我有点无知.
dmi*_*_vk 10
我写的是这样的:
(defmacro with-hooks ((monster method who what) &body body)
(let ((monster-var (gensym))
(method-var (gensym))
(who-var (gensym))
(what-var (gensym)))
`(let ((,monster-var ,monster) ; dummy comment
(,method-var ,method)
(,who-var ,who)
(,what-var ,what))
(add-hook ,monster-var ,method-var ,who-var ,what-var)
(unwind-protect
(progn ,@body)
(remove-hook ,monster-var ,method-var ,who-var)))))
Run Code Online (Sandbox Code Playgroud)
一些说明:
something-vars的用于确保为表达式monster,method,who,what仅计算一次(因为这些表达式被引用在宏体多次),并在左到右的顺序.gensyms用于确保变量具有唯一名称remove-hook即使在非本地退出的情况下也会调用(例如,由于异常被抛出而导致堆栈展开).| 归档时间: |
|
| 查看次数: |
280 次 |
| 最近记录: |