2017-03-03 45 views
1
  1. 我不禁注意到,筆者更喜歡叫(first options)多次超過緩存結果:關於defmulti的來源問題

    [docstring (if (string? (first options)) 
           (first options) 
           nil) 
    options  (if (string? (first options)) 
           (next options) 
           options) 
    m   (if (map? (first options)) 
           (first options) 
           {}) 
    options  (if (map? (first options)) 
           (next options) 
           options) 
    ...] 
    

我認爲這是確定(以性能條款),因爲它定義了一個將在編譯期間執行的宏?

  1. 我還不確定是否理解調用宏的評估過程。以(defmulti ...)爲例,糾正我,如果我錯了:在編譯過程中,宏是擴展,其中結果是調用特殊的let窗體,這反過來又翻譯成字節碼。那又怎麼樣?

  2. 假裝我們定義一個FN,而不是一個宏觀的,是值得引入一個額外的符號緩存(first options)結果:

    [f   (first options) 
    docstring (if (string? f) 
           f 
           nil) 
    options  (if (string? f) 
           (next options) 
           options) 
    f   (first options) 
    m   (if (map? f) 
           f 
           {}) 
    options  (if (map? f) 
           (next options) 
           options) 
    ...] 
    
  3. 究竟意味着什麼,一個變種hasRoot?什麼是Unbound

回答

1
  1. 是,呼籲first快。可變參數表示爲一個序列,具體來說是一個clojure.lang.ArraySeq(至少要等到一定數量的參數)。

    user=> ((fn [& args] (type args)) 1 2 3) 
    clojure.lang.ArraySeq 
    

    first()ArraySeq的實施是一個陣列查找

    public Object first(){ 
        if(array != null) 
         return array[i]; 
        return null; 
    } 
    

    https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/ArraySeq.java#L69

  2. 然後字節碼然後被裝載到JVM並執行。

  3. 我懷疑這會有所作爲。

  4. var可以具有線程語言環境綁定,這意味着每個線程都可以看到不同的值。根綁定是var初始化的值。線程區域設置綁定不會壓縮根綁定,它只是遮蔽它。 Unbound是針對沒有根綁定創建的變量的實現優化。

    查看clojure.core/binding瞭解如何設置線程區域設置值。