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 - 我看到如下提示處理代碼:
- hinted arg list
- emit static value from hinted fields
- get the class of the hinted field
- if hinted match method
但我沒有看到它處理的位鍵入提示失敗。
我的問題是:爲什麼Clojure編譯器不會爲錯誤的類型提示引發錯誤?
的快速演示亞歷克斯的評論你說有關提示和錯誤的用戶=>(^。長度字符串[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
類型提示也可以用來創建不帶裝箱的基本數字參數的函數,雖然在這種情況下不相關。 – Alex