compilation - 编译器的信号和错误之间的区别 (sbcl 1.2.4)

标签 compilation lisp common-lisp sbcl

我从 SBCL 编译器中得到了奇怪的错误,所以可能有人可以向我解释那里发生了什么。有关该软件包使用 optima 和 drakma 的信息。我真的试图缩小发布的代码,但理解问题需要这个数量。

(defun signal-vk-error (code)
  (error ;; <--- HERE IS THING
    (case code
      (100 'parse-error)
      (otherwise 'error))))

(defmacro match-with-error (response matcher)
  `(match ,response
         ((alist (:ERROR . code))
          (signal-vk-error code))
         ,matcher))

(defun api-call-response (resp)
  (match-with-error
    resp
    ((alist (:RESPONSE . data)) data)))

编译我得到的这个文件:

; caught ERROR:
;   don't know how to dump CODE (default MAKE-LOAD-FORM method called).
Unhandled TYPE-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
                                  {1002BF6F03}>:
  The value NIL is not of type (AND ATOM (NOT NULL)).

所以看起来 sbcl (1.2.4) 无法创建二进制表示,但我无法理解为什么。

如果我只是在 signal-vk-error 中将 ERROR 更改为 SIGNAL - 一切都会按预期进行编译、加载和工作。我也可以只在 slime 和 eval 中加载文件,它会在没有错误和警告的情况下工作。

那么,问题来了,error有什么问题? errorsignal 之间的主要区别是什么?

更新 1: 有趣的观察,如果我删除 signal-vk-error 函数,并将这段代码放在宏定义中,它会编译正常。

更新 2:感谢@RainerJoswig,声明 signal-vk-error 不被内联修复了这个问题。 Reported to SBCL team ,看起来他们做了一些优化,在这种情况下破坏了编译。

最佳答案

重现问题的最小方法:

(defun signal-vk-error ()
  (error 'error))

(defun api-call-response ()
  (optima:match 1
    ((not 2)
     (signal-vk-error))))

如果我宏展开或遍历 match 表单,问题就会消失。

以下也使问题消失。

(declaim (notinline error))

关于compilation - 编译器的信号和错误之间的区别 (sbcl 1.2.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26240236/

相关文章:

c++ - 编译 OpenCV 程序并且不需要安装 opencv

lisp - Emacs 口齿不清 : why does this sexp cause an invalid-function error?

scheme - Racket 方案 - 流图问题

objective-c - 为什么这个 block 在它的描述符中没有复制和处置指针?

c - 未定义的乘法引用

linux - 控制台上的 SLIME

lisp - CLISP FFI 外国值(value)问题

assembly - 有没有办法让 sbcl 打印出 CPU 寄存器的值?

lisp - 如何在列表中放置一个元素? (口齿不清)

c - 在Linux上编译OpenCL ICD加载器时出错