如何撤消`declaration`公告?

sds*_*sds 7 common-lisp

似乎大多数(如果不是全部)全局声明都不能以ANSI CL标准方式恢复.

例如,一旦你评估(直接或通过加载文件)一个表格,(proclaim '(declaration my-decl))(declaim (special *my-var*))没有便携式的方式来制造(declare (my-decl ...))非法或*my-var*词汇.

各种实现提供了不可移植的方式来恢复special声明,通常是通过(proclaim '(notspecial *my-var*))或其他一些技巧.

如何在宣布declaration

各种实现如何撤消它?你会如何实现它?你认为这(proclaim '(notdeclaration my-decl))是个好主意吗?

动机:在测试套件中,模块化会很好 - 能够恢复测试语句的所有效果,以避免任何可能干扰测试套件的部分.我知道这是一周动机,因为正确的方法是使用.

cor*_*ump 1

一种可能的方式是提供事务机制(回滚/提交)。这取自 Xach 的 Naggum档案

我错过了一个事务工具,我可以在其中对系统进行许多更改
,这些更改仅对多线程
执行环境的我的线程可见,然后丢弃它们或立即提交它们
。例如,加载文件可能就是这样的事务。在加载过程中发出错误信号可能会导致 之前的
全部操作被丢弃,而不是让系统处于 部分修改的状态。 在现有系统之上构建并非不可能,但需要付出巨大的努力,因此这是 Common Lisp 系统程序员应该做的事情。



您可能会错过仅撤消声明子集的可能性,例如(declare A), (declare B)(undeclare A)但考虑到您的动机,这不会成为问题,因为您可能希望撤消测试期间所做的所有可能的声明。

您可以提供特殊表格来单独“取消声明”声明。我将其命名为“retract”,但这在某些情况下可能很难指定。假设您声明 x 是字符串或数字,您可以撤回 x 是字符串的声明吗?内联函数等呢?事务看起来更容易实现,例如使用临时环境。