我從SBCL編譯器得到了奇怪的錯誤,所以可能有人可以向我解釋發生了什麼。有關該軟件包使用optima和drakma的信息。我真的試圖縮小發布的代碼,但這個數量需要理解這個問題。編譯器的信號和錯誤之間的區別(sbcl 1.2.4)
(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)不能創建二進制表示,但我不能underestand原因。
如果我只是將signal-vk-error中的ERROR更改爲SIGNAL,則everyhing編譯,加載和按預期工作。我也可以加載文件在史萊姆和評估是,它將工作沒有錯誤和警告。
那麼,問題是,error
有什麼問題? error
和signal
之間的主要區別是什麼?
更新1:有趣的觀察,如果我刪除signal-vk-error函數,並將這個代碼放在宏defenition裏面,它會編譯好的。
UPDATE 2:感謝@RainerJoswig,宣佈signal-vk-error
未被內聯解決問題。 Reported to SBCL team,看起來像他們做了一些優化,這在這種情況下編制。重現該問題
哪裏代碼可變來自何處?使用宏展開來查看宏展開的內容。 – 2014-10-07 16:24:25
我試過了。 optima:匹配只是將變量代碼綁定到alist中指定位置的值,如果有的話。宏展開沒有給出任何線索(不想在此發佈長代碼)。無論如何,在函數defenition中調用'error',如果變量有問題,爲什麼將'error'改爲'signal'會有幫助?它不應該。 – coredump 2014-10-07 16:29:36
如果沒關係,你應該能夠簡化代碼並仍然看到錯誤。 – 2014-10-07 16:37:56