【问题标题】:Using the [Take New] restart in SBCL在 SBCL 中使用 [Take New] 重启
【发布时间】: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


    【解决方案1】:

    handler-case 在将控制权转移给处理程序之前退出重新启动的范围;你需要handler-bind。构造之间的另外两个区别是handler-bind 具有不同的语法(如下所示),并且handler-bind 不转移控制——也就是说,handler-bind 处理程序返回一个需要显式转移的值控制,例如与return-frominvoke-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)))
    

    【讨论】:

    • 这行得通。该死,我需要阅读更多关于 CL 中的条件处理的信息。粗略搜索让我得到thisthis 和(当然)this
    • @Inaimathi 这个 Kent Pitman paper 的“在信号员的上下文中处理”部分似乎很好地阐述了这里的问题。看看 CLTL2 链接,它的大部分条件讨论似乎都在第 29 章(也是 Pitman 的)。
    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2016-08-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多