这是我尝试使用的“clx-user-callable.lisp”中定义的宏。
(in-package :clx-gui)
(defmacro get-callback-wrapper (callback)
(declare (ignorable callback))
(let* ((func-name (gensym))
(wrapper-name (intern (format nil "WRAPPER-~a" func-name) )))
`(defun ,wrapper-name (caller-instance)
(funcall ,callback) ;; User callbacks wont have arguments
(closemenu caller-instance))))
我以这种方式调用这个宏,它可以正常工作。
(in-package :clx-gui-test-app)
(create-user-menuitem "MyUserMenu" "MyEntryDialog"
(get-callback-wrapper 'my-callback))
(create-user-menuitem "MyUserMenu" "MyChoiceDialog"
(get-callback-wrapper 'my-callback2))
(create-user-menuitem "MyUserMenu" "MyMessageDialog"
(get-callback-wrapper 'my-callback3))
如果我以这种方式更改代码以使用宏,通过将回调的符号名称传递给调用宏的函数,它不会返回不同的包装函数,但总是返回相同的包装函数。调用宏的函数与宏定义在同一个文件和包中。
(in-package :clx-gui-test-app)
(create-user-menuitem "MyUserMenu" "MyEntryDialog" 'my-callback)
(create-user-menuitem "MyUserMenu" "MyChoiceDialog" 'my-callback2)
(create-user-menuitem "MyUserMenu" "MyMessageDialog" 'my-callback3)
我尝试将包添加到宏定义中,但这无济于事。
(wrapper-name (intern (format nil "WRAPPER-~a" func-name)
(symbol-package callback) )))
我做错了什么?
我正在使用 SBCL-1.0.57 和 Slime。