二进制文件是从包含以下定义的 .lisp 文件生成的:
(in-package :xpto)
(defmacro defparam (name init.value)
`(progn
(defvar ,name ,init.value)
(eval-when (:compile-toplevel :load-toplevel :execute)
(export ',name "xpto"))))
(defparam myparam 10)
(defun getparam()
myparam)
所以,我想制作一个补丁文件以覆盖该符号,因此,我想到了类似的东西:
;; Unintern the given symbol because otherwise we are not able to overwrite it
;; once it was set through defvar
(eval-when (:compile-toplevel :load-toplevel :execute)
(unintern 'xpto::myparam :xpto))
加载补丁文件后,奇怪的行为开始出现:
> :pa xpto
> myparam
>> Error: Attempt to take the value of the unbound variable `myparam'
上面的输出是我所期待的,但这个让我很困扰:
> (getparam)
>> 10
我期待没有返回任何值,因为该符号不再存在。
如何以任何对它的引用返回上面显示的错误消息的方式删除/取消myparam符号?
ps:在补丁文件中运行以下表达式对我来说不是一个有效的选项:
(setf myparam 20)