当我试图以导致名称冲突的方式重新定义SBCL中的包时,我会在重新启动时得到一个NAME-CONFLICT错误。
0: [KEEP-OLD] Keep symbols already accessible FOO (shadowing others).
1: [TAKE-NEW] Make newly exposed symbols accessible in FOO, uninterning old ones.
2: [RESOLVE-CONFLICT] Resolve conflict.
3: [RETRY] Retry SLIME REPL evaluation request.
4: [*ABORT] Return to SLIME's top level.
5: [ABORT] Abort thread (#<THREAD "new-repl-thread" RUNNING {10060E47B3}>)我想写一些自动调用TAKE-NEW重新启动的东西,这样我就可以做如下的事情
(force (defpackage :foo (:use :cl :bar :baz :mumble)))其结果应该与调用defpackage相同,然后手动调用TAKE-NEW重新启动。问题是,
CL-USER> (handler-case
(defpackage :foo (:use :cl :bar :baz :mumble))
(error (e) (compute-restarts e)))
(#<RESTART SWANK::RETRY {1006DC40F3}> #<RESTART ABORT {10068007E3}>
#<RESTART ABORT {10060C7F93}>)
CL-USER> 我似乎无法访问那个特定的重新启动。正如我试图调用它时所确认的那样:
CL-USER> (handler-case
(defpackage :foo (:use :cl :bar :baz :mumble))
(name-conflict (e) (invoke-restart 'take-new)))
No restart TAKE-NEW is active.
[Condition of type SB-INT:SIMPLE-CONTROL-ERROR]
Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [*ABORT] Return to SLIME's top level.
2: [ABORT] Abort thread (#<THREAD "new-repl-thread" RUNNING {10060E47B3}>)有什么想法吗?
发布于 2014-09-10 20:26:33
handler-case在将控制权转移到处理程序之前退出重新启动的范围;您需要handler-bind。这些构造之间的另外两个不同之处是,handler-bind有不同的语法(如下所示),而handler-bind不传输控制--也就是说,handler-bind处理程序返回显式传递控制所需的值,例如使用return-from或invoke-restart。
下面这样的东西应该能起作用:
(handler-bind ((sb-ext:name-conflict
(lambda (c)
(when (find-restart 'sb-impl::take-new c)
(invoke-restart 'sb-impl::take-new)))))
(defpackage :foo (:use :mumble)))https://stackoverflow.com/questions/25773251
复制相似问题