4

假設:爲什麼Clojure編譯器不會爲錯誤的類型提示引發錯誤?

  • 我得到這種類型的提示是對性能的優化,而不是類型檢查。我試圖解決性能優化無效的問題。

假設我有以下代碼:

(ns test.core) 

(defrecord SquarePeg [width length]) 
(defrecord RoundHole [radius]) 

(def square-peg (SquarePeg. 5 50)) 

(defn insert-peg [^test.core.RoundHole peg] 
    (println "insert-peg inserted with: " peg)) 

(defn -main 
    "Insert a square peg in a round hole" 
    [& args] 
    (insert-peg square-peg)) 

當我運行它,我得到:

insert-peg inserted with: #direct_linking_test.core.SquarePeg{:width 5, :length 50} 

現在,我預計這將有一些一種指示該類型提示錯了,但事實並非如此。

現在我正在看Clojure Compiler code - 我看到如下提示處理代碼:

但我沒有看到它處理的位鍵入提示失敗。

我的問題是:爲什麼Clojure編譯器不會爲錯誤的類型提示引發錯誤?

回答

4

大部分類型提示[1]僅影響否則會使用反射的代碼 - 即互操作代碼。

由於您的insert-peg函數不會執行任何互操作,因此對於類型提示沒有用處,並且它被忽略。

當您的類型提示導致clojure編譯器編寫調用一種類型的方法的字節碼時,會發生類型錯誤,但在運行時實例結果是另一種類型。

[1]見異常下面

+1

的快速演示亞歷克斯的評論你說有關提示和錯誤的用戶=>(^。長度字符串[1 2 3])用戶=>(DEFN什麼strlen [^ String s](.length s)) #'user/strlen user =>(strlen [1 2 3]) ClassCastException clojure.lang.PersistentVector無法轉換爲java.lang.String user/strlen( NO_SOURCE_FILE:4) – noisesmith

+1

類型提示也可以用來創建不帶裝箱的基本數字參數的函數,雖然在這種情況下不相關。 – Alex

相關問題