これは、私が使用しようとしている「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 を使用しています。