BRP*_*ock 3 error-handling sbcl common-lisp
在swig用于包装C++库时,我一直试图绕过一个errorun eqlconstant 的编译时被重新定义...在这种情况下,是一个equal但不是eql字符串的文字.
奇怪的是,在SLIME中我能够简单地调用CONTINUE重启并绕过这个特定的错误.然而,当我尝试用把它包起来handler-case,并通过完成构建它compile-file或slime-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)
HANDLER-CASE不是正确的工具.在调用其子句时,堆栈已经解开.HANDLER-BIND的子句是在堆栈展开之前发出错误信号的上下文中调用的,因此请使用HANDLER-BIND.
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |