【发布时间】:2014-09-10 19:11:34
【问题描述】:
当我尝试以导致名称冲突的方式在 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}>)
有什么想法吗?
【问题讨论】:
标签: error-handling package common-lisp