Error handling SBCL:编译期间是否继续重新启动?(事实上:在处理人案例中缺席) < >使用 SWIG/包装C++库,我一直试图绕过编译时错误E>代码> > EQL 常数被重新定义…在这种情况下,到相等< /COD>但UNU EQL字符串文字。

Error handling SBCL:编译期间是否继续重新启动?(事实上:在处理人案例中缺席) < >使用 SWIG/包装C++库,我一直试图绕过编译时错误E>代码> > EQL 常数被重新定义…在这种情况下,到相等< /COD>但UNU EQL字符串文字。,error-handling,common-lisp,sbcl,Error Handling,Common Lisp,Sbcl,奇怪的是,在SLIME中,我能够简单地调用CONTINUErestart并绕过这个特定错误。但是,当我尝试用处理程序案例包装它,并通过编译文件或slime编译文件或通过buildapp构建它时,继续重新启动似乎丢失了(格式t“重新启动:~{~%•~A~%:*~S~”(计算重新启动))一致。 我只是有点偏执,我试过: (continue) (invoke-restart 'continue) (invoke-restart (find-restart 'cl::continue)

奇怪的是,在SLIME中,我能够简单地调用
CONTINUE
restart并绕过这个特定错误。但是,当我尝试用
处理程序案例
包装它,并通过
编译文件
slime编译文件
或通过
buildapp
构建它时,
继续
重新启动似乎丢失了<代码>(格式t“重新启动:~{~%•~A~%:*~S~”(计算重新启动))一致。 我只是有点偏执,我试过:

   (continue)
   (invoke-restart 'continue)
   (invoke-restart (find-restart 'cl::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))))))

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

d'oh。谢谢,我知道这一定是(:facepalm:)之类的事情,但我花了一个小时诊断错误的问题。