【问题标题】:When and how should independent hierarchies be used in clojure?何时以及如何在 clojure 中使用独立的层次结构?
【发布时间】:2011-03-02 00:34:17
【问题描述】:

Clojure 用于创建特定关键字层次结构的系统对于大多数使用该语言的人来说都很熟悉。例如,该语言的大多数演示和演示都包含诸如

之类的示例
(derive ::child ::parent)

他们继续展示如何将其用于多方法调度。

在我看过的所有幻灯片和演示文稿中,它们都使用全局层次结构。但是可以通过使用 (derive h ::child ::parent) 将关键字关系放在独立的层次结构中,其中 h 由 (make-hierarchy) 创建。因此,一些问题:

  • 是否有关于何时有用或必要的指南?
  • 是否有任何用于操作层次结构的函数?

合并特别有用,所以我这样做:

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

但我想知道这样的功能是否已经存在于某个地方。

编辑:将“自定义”层次结构更改为“独立”层次结构,因为该术语更好地描述了这种动物。另外,我做了一些研究,并在下面包含了我自己的答案。欢迎更多的cmets。

【问题讨论】:

    标签: clojure hierarchy keyword


    【解决方案1】:

    过去几天我一直在研究这个问题,我想我有一些答案:

    1. 在独立层次结构上使用的函数与在全局层次结构上使用相同函数时具有不同的语义。执行 (derive kwd1 kwd2) 会产生副作用——全局层次结构中的一个条目。另一方面,(derive hierarchy kwd1 kwd2) 是函数式的——该函数返回一个新的层次结构,而不是修改一个 var。
    2. 使用独立的层次结构允许您对相同的关键字有多个不同的层次结构。比如:

      (def 篮球层次结构 (派生 (make-hierarchy) :gretzky :jordan))

      (def hockey-hierarchy (derive (make-hierarchy) :jordan :gretzky))

    可能表明 :jordan 在篮球层次结构中高于 :gretzky,而在曲棍球层次结构中则相反。

    另外:非命名空间关键字可以放入独立的层次结构中,但不能放入全局层次结构中。所以

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

    会起作用,但对于全局层次结构,这些关键字必须位于命名空间中:

    (derive :nspace/a :nspace/b)
    

    其中 nspace 是一些命名空间。 (有趣的是,这个命名空间实际上不必在任何地方声明。)

    因此,总而言之,当需要多个层次结构或需要在运行时对层次结构进行大量修改时,应该使用独立的层次结构。此外,如果我们想要裸关键字的层次结构,则需要一个独立的层次结构。

    【讨论】:

    • 体育示例的一个问题是:(isa? hockey-hierarchy :jordan :gretzky) => true。即,这些是类型层次结构。但这一点是正确的:相同的词可能是不同领域中不同类型关系中的不同类型,因此需要本地层次结构。事实上,我很惊讶我们被允许扰乱全局层次结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多