2010-06-10 26 views
12

Clojure用於創建關鍵字特設層次結構的系統對於花費一點時間處理該語言的大多數人來說是很熟悉的。例如,大多數演示和語言的表現包括例子,如獨立層次結構何時以及如何在clojure中使用?

(derive ::child ::parent) 

和他們去展示如何這可以用於多方法分派。

在我看到的所有幻燈片和演示文稿中,它們都使用全局層次結構。但是通過使用(派生h :: child :: parent),可以將關鍵字關係置於獨立的層次結構中,其中h由(make-hierarchy)創建。有些問題,因此:

  • 是否有任何指導方針時,這是有用的或必要的?
  • 是否有任何操作層次結構的函數?

合併是特別有用的,所以我這樣做:

(defn merge-h [& hierarchies] 
    (apply merge-with (cons #(merge-with clojure.set/union %1 %2) hierarchies)) 

但我在想,如果某個已經存在這樣的功能。

編輯:將「自定義」層級更改爲「獨立」層級,因爲該術語更好地描述了這種動物。另外,我做了一些研究,並在下面列出了我自己的答案。歡迎進一步的意見。

回答

5

我開始鑽研這個問題在過去的幾天裏,我覺得我有一些答案:自主層次使用

  1. 功能具有當同樣的功能在全球層次結構中使用了不同的語義。做(派生kwd1 kwd2)會產生副作用 - 全局層次結構中的條目。另一方面,(派生層次結構kwd1 kwd2)是功能性的 - 函數返回一個新的層次結構,而不是修改var。
  2. 使用獨立層次結構允許您爲同一個關鍵字擁有多個不同的層次結構。因此,例如:

    (DEF籃球的層次結構(派生的(補充層次):格雷茨基:約旦))

    (DEF曲棍球層次(派生的(補充層次):約旦:格雷茨基))

可能表明:jordan在籃球等級中高於:gretzky,而曲棍球等級中則相反。

另外:非名稱空間關鍵字可以放入獨立的層次結構中,但不能放入全局層次結構中。所以

(derive (make-hierarchy) :a :b) 

會的工作,但對於全球層次,這些關鍵字必須是在一個命名空間:

(derive :nspace/a :nspace/b) 

其中nspace是一些命名空間。 (有趣的是,這個命名空間實際上並不需要在任何地方聲明。)

總之,當需要多個層次結構或需要在運行時廣泛修改層次結構時,應使用獨立層次結構。另外,如果我們想要裸關鍵字的層次結構,則需要獨立的層次結構。

+0

運動例子的一個問題是:(isa?hockey-hierarchy:jordan:gretzky)=> true。即,這些是類型層次結構。但是這一點是有效的:在不同領域的不同類型關係中,相同的詞可能是不同的類型,從而使得本地層次結構是必需的。事實上,我很驚訝我們被允許混淆全球層級。 – kennytilton 2016-03-31 07:27:13

相關問題