2015-11-21 51 views
4

在Clojure中,某些任務(如實例化PersistentQueue或使用deftype實現與clojure.core函數兼容的自定義數據類型)需要了解clojure.lang中的類和/或接口。clojure.lang真的只是實現細節?

然而,根據clojure.lang/package.html

中唯一的類被認爲是公共API的一部分是clojure.lang.IFn。所有其他類應被視爲實施細節。

這些陳述是不正確的還是過時的?如果是這樣,是否有計劃在未來改正它們?如果沒有,是否有更好的方式來執行上述任務,或者根本就不應該在慣用的Clojure代碼中完成任務?

+0

僅僅因爲'clojure.lang'的成員被認爲是實現細節並不意味着你不能引用它們。相反,它只是意味着你不應該期望這樣的代碼是可移植的(例如,你可能需要爲Clojure和ClojureScript分開編寫代碼)。 – DaoWen

+1

@DaoWen clojure.lang被認爲是一個實現細節,不僅僅意味着代碼不是可移植的。從最嚴格的意義上講,只要公共接口保持不變,實現細節可以隨時更改。然而'clojure.lang'並不是那麼好戰。 –

回答

2

亞歷克斯·米勒對這個commented過去(整個主題是值得一讀,雖然):

我會說有一系列的「公共」 -ness到的Clojure的內部的。

  • 新的Clojure API(clojure.java.api.Clojure)是Clojure的外部來電者的正式公開的API。這個API基本上包括解決變量和調用函數的方法。
  • 對於Clojure中的Clojure用戶,幾乎所有公開的var都有一個文檔字符串,並且顯示在api文檔中可以被視爲公共API。
  • 私密或沒有文檔字符串的Clojure vars(例如,從公共api文檔中省略var)可能需要非常小心。
  • Clojure內部Java接口[clojure.lang]肯定是爲了讓圖書館建設者能夠創建在Clojure世界中發揮作用的有用內容。我不知道有人曾經說過他們是「公開」的,但我肯定認爲任何對可能打破外部用戶的核心界面的改變都會被認真考慮。
  • Clojure內部Java類[clojure.lang]在大多​​數情況下應該被認爲是私有的,如有更改,恕不另行通知。即使在那裏也有灰色地帶。

一般來說,我們並沒有對封裝或隱藏內部進行很高的評價。在大多數情況下,如果內部消息對於高級用戶可能對做有趣的事情有用,那麼內部消息仍然可用,但要注意的是,你做的事情越是奇怪,越有可能在未來的版本中被意外破壞。