SBCL:继续在COMPILE期间重新启动?(真的是:HANDLER-CASE缺席)

BRP*_*ock 3 error-handling sbcl common-lisp

swig用于包装C++库时,我一直试图绕过一个errorun eqlconstant 的编译时被重新定义...在这种情况下,是一个equal但不是eql字符串的文字.

奇怪的是,在SLIME中我能够简单地调用CONTINUE重启并绕过这个特定的错误.然而,当我尝试用把它包起来handler-case,并通过完成构建它compile-fileslime-compile-file或通过buildapp,将CONTINUE重启似乎缺少.(format t "Restarts: ~{~% • ~A~% ~:*~S~}" (compute-restarts))赞同.只是为了偏执,我试过:

   (continue)
   (invoke-restart 'continue)
   (invoke-restart (find-restart 'cl::continue))
Run Code Online (Sandbox Code Playgroud)

还有一些变化.

(unless (continue) (warn "Can't continue")) 奇怪的是,也没有警告我,但编译也没有完成文件.

由于我想要转换为关键字参数的一些更可怕的C++多态的情况,我继续使用swig生成的代码的复制和编辑版本,但我很好奇为什么重启将不存在以及我是否可以做了一些事情(可能是一些难以定位的动态设置)会绕过它.

编辑:为了避免它有用,一个变量已经:

(handler-case
  (compile-file "path/to/swig-made-this-mess")
  ;; contains (defconstant foo "string")

  #+sbcl
  (SB-EXT:DEFCONSTANT-UNEQL (condition)
    (let ((name (SB-EXT:DEFCONSTANT-UNEQL-NAME condition))
          (before (SB-EXT:DEFCONSTANT-UNEQL-OLD-VALUE condition))
          (after (SB-EXT:DEFCONSTANT-UNEQL-NEW-VALUE condition)))
      (if (equal before after)
          (progn
            (warn "Redefining constant to un-EQL but EQUAL value~%~S ? ~S"
                  name after)
            (unless (continue)
              (warn "Unable to CONTINUE~%~%Restarts:~{~% • ~A~%     ~:*~S~}"
                    (compute-restarts))
              (signal condition)))
          (progn
            (warn "Redefining constant to un-EQUAL value:~%~S ?~%before: ~S~%after: ~S"
                  name before after)
            (signal condition))))))
Run Code Online (Sandbox Code Playgroud)

Xac*_*ach 7

HANDLER-CASE不是正确的工具.在调用其子句时,堆栈已经解开.HANDLER-BIND的子句是在堆栈展开之前发出错误信号的上下文中调用的,因此请使用HANDLER-BIND.