2014-10-07 40 views
1

我從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有什麼問題? errorsignal之間的主要區別是什麼?

更新1:有趣的觀察,如果我刪除signal-vk-error函數,並將這個代碼放在宏defenition裏面,它會編譯好的。

UPDATE 2:感謝@RainerJoswig,宣佈signal-vk-error未被內聯解決問題。 Reported to SBCL team,看起來像他們做了一些優化,這在這種情況下編制。重現該問題

+1

哪裏代碼可變來自何處?使用宏展開來查看宏展開的內容。 – 2014-10-07 16:24:25

+0

我試過了。 optima:匹配只是將變量代碼綁定到alist中指定位置的值,如果有的話。宏展開沒有給出任何線索(不想在此發佈長代碼)。無論如何,在函數defenition中調用'error',如果變量有問題,爲什麼將'error'改爲'signal'會有幫助?它不應該。 – coredump 2014-10-07 16:29:36

+0

如果沒關係,你應該能夠簡化代碼並仍然看到錯誤。 – 2014-10-07 16:37:56

回答

0

因爲它出來了,在編譯器中有一個問題,實際上其中有兩個,其中一個據稱是一個功能。任何感興趣的人都可以閱讀SBCL黑客之一和optima in bugtracker的作者之間的對話。

現在這通過不露出macroexpasion期間圖案對象在固定最適側,commit d7ec93d0df4920b9a7b4a492e7aadf52480f437c

1

最小方式:

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

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

如果我macroexpand或走match形式,問題消失。

以下內容也會使問題消失。

(declaim (notinline error)) 
+0

謝謝。 Tt更簡單。我更改了bugreport中的代碼。也檢查了CCL - 編譯時沒有聲明。 – coredump 2014-10-07 19:35:26

相關問題