2012-12-25 44 views
6

有沒有辦法在Clojure中將某個符號標記爲過時?Clojure中的過時符號

我可以使用Lein這樣的工具。

https://github.com/technomancy/leiningen/blob/1.x/src/leiningen/core.clj#L13

但是它當一個函數被調用僅發出警告的。我真的很喜歡編譯器在編譯代碼時選擇它,而不是在調用代碼時。

當然,我可能只是定義符號,其編譯器會再挑 ,但是這剝奪了我的能力,以提供任何信息,比如爲什麼,或者當 符號已被棄用。

所有這一切對於其中條款的折舊和報廢是要以合理的速度發生一個DSL。

+1

不是將函數重新定義爲另一個函數,而是將其重新定義爲在編譯時展開時發出警告的宏。 – Barmar

+0

@Barmar這使得它不可能用作參數或文字。可怕的想法。相反,只需在展開宏的擴展時強制執行警告。 (這當然意味着警告只發生在編譯庫時,這可能不是你想要的)。 – Cubic

+0

@cubic不,這也是錯誤的。關鍵是要警告客戶端應用程序何時_use_過時的功能,而不是庫編譯時。我想要得到真正想要的東西,將會在Clojure編譯器中得到特別的支持。 – Barmar

回答

1

有一些已經在有關使用宏的意見,但有人指出這排除使用功能上的HOF。你可以解決這個問題,雖然它可能是治癒不比疾病更糟。例如,假設你的函數是

(defn foo* [x y] (+ x y)) 

然後,而不是寫

(defmacro foo [x y] (warn) `(foo* x y)) 
(foo 1 2) 
(map foo [5 6] [7 8]) 

,你可以讓宏擴展的功能,這當然可以像任何其他可用於:

(defmacro foo [] (warn) `foo*) 
((foo) 1 2) 
(map (foo) [5 6] [7 8]) 

也許不值得的尷尬,但是會提供一種方式來抱怨只要使用棄用的功能,同時仍保持possibilit y的HOF使用。

0

這真的取決於你的DSL是如何設計的。如果你可以設計你的DSL使得每個表格必須被包裹在一個go或類似的東西通話,那麼你可以寫這個go宏這確實是這樣的:

(從clojure.walk)所傳遞的形式
  1. macroexpand-all
  2. 使用postwalk(從clojure.walk)以上恢復形式,並檢查任何遇到的符號由可能看不推薦使用符號的一些全局列表棄用。您可能需要對符號執行resolve以獲取符號的命名空間限定名稱。
  3. 如果找到任何廢棄的符號,則顯示打印消息。
  4. 按原樣返回輸入表單。

go宏然後可以用於其他預處理您的DSL,因爲這是您的DSL執行的入口點。

注意:您可能需要拿出解決方案,其中用戶從棄用的標誌之一,他/她自己的符號使用相同的名稱,但同樣這可能並不需要取決於你的DSL設計。