首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个未被拘留的符号的奇怪行为

一个未被拘留的符号的奇怪行为
EN

Stack Overflow用户
提问于 2013-06-20 14:43:37
回答 2查看 154关注 0票数 2

二进制文件是从包含以下定义的.lisp文件生成的:

代码语言:javascript
复制
 (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)

因此,我想创建一个补丁文件来覆盖这个符号,因此,我想到了这样的东西:

代码语言:javascript
复制
;; 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))  

加载修补程序文件后,出现了奇怪的行为:

代码语言:javascript
复制
>  :pa xpto
>  myparam  
>> Error: Attempt to take the value of the unbound variable `myparam'

上面的输出正是我所期望的,但这一项却让我感到困扰:

代码语言:javascript
复制
>  (getparam)
>> 10

因为符号不再存在,所以我希望没有返回任何值。

如何删除/取消对myparam符号的任何引用都会返回上面显示的错误消息?

p.s:在修补程序文件中运行以下表达式对我来说不是一个有效的选项:

代码语言:javascript
复制
(setf myparam 20)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-20 15:24:18

当您计算(defun getparam)时,它会记住符号myparam,每当您调用(getparam)时,它都会返回符号值。myparam的取消实习意味着您无法按名称在包中找到符号,但符号对象仍然存在。

代码语言:javascript
复制
(defvar myparam 10)
(defun getparam() myparam)
#'getparam
==> #<FUNCTION GETPARAM NIL ... (BLOCK GETPARAM MYPARAM)>
(unintern 'myparam)
#'getparam
==> #<FUNCTION GETPARAM NIL ... (BLOCK GETPARAM #:MYPARAM)>
(getparam)
==> 10

请注意,函数的第二个打印输出包含一个未嵌入的符号。

编辑

如何删除/取消对myparam符号的引用,以返回上面显示的错误消息?

除了重新定义getparam之外,没有其他方法。

但是,您可以不同地定义getparam

代码语言:javascript
复制
(defvar myparam 10)
(defun getparam() 
  (symbol-value (or (find-symbol "MYPARAM") 
                    (error "Symbol MYPARAM does not exist"))))
(getparam)
==> 10
(unintern 'myparam)
(getparam)
*** - Symbol MYPARAM does not exist
票数 4
EN

Stack Overflow用户

发布于 2013-06-20 16:31:51

您还可以使符号解除绑定:

代码语言:javascript
复制
CL-USER 4 > (defvar foosym 10)
FOOSYM

CL-USER 5 > foosym
10

CL-USER 6 > (makunbound 'foosym)
FOOSYM

CL-USER 7 > foosym

Error: The variable FOOSYM is unbound.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17216681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档