Когда и как независимые иерархии должны использоваться в clojure?

Система Clojure для создания специальной иерархии ключевых слов знакома большинству людей, которые провели немного времени с языком. Например, большинство демонстраций и презентаций языка включают примеры такой как

(derive ::child ::parent)

и они продолжают показывать, как это может использоваться для отправки мультиметода.

Во всех слайдах и презентациях, которые я видел, они используют глобальную иерархию. Но возможно поместить отношения ключевого слова в независимые иерархии, при помощи (получите h:: ребенок:: родитель), где h создается (делать-иерархией). Некоторые вопросы, поэтому:

  • Есть ли какие-либо инструкции по тому, когда это полезно или необходимо?
  • Есть ли какие-либо функции для управления иерархиями?

Слияние особенно полезно, таким образом, я делаю это:

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

Но я задавался вопросом, существуют ли такие функции уже где-нибудь.

Править: Измененная "пользовательская" иерархия к "независимой" иерархии, так как тот термин лучше описывает это животное. Кроме того, я провел некоторое исследование и включал мой собственный ответ ниже. Дальнейшие комментарии приветствуются.

12
задан Rob Lachlan 16 June 2010 в 05:24
поделиться

1 ответ

Я вникал в эту проблему в последние несколько дней и думаю, что у меня есть некоторые ответы:

  1. Функции, используемые в независимых иерархиях, имеют отличается от семантики, когда одни и те же функции используются в глобальной иерархии. Выполнение (производное kwd1 kwd2) производит побочный эффект - запись в глобальной иерархии. С другой стороны, (производная иерархия kwd1 kwd2) является функциональной - функция возвращает новую иерархию вместо изменения переменной var.
  2. Использование независимых иерархий позволяет иметь несколько разных иерархий для одних и тех же ключевых слов. Так, например:

    (def баскетбольная иерархия (производная (make -ierarchy): gretzky: jordan))

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

Может указывают, что: jordan выше в иерархии баскетбола, чем: gretzky, тогда как в иерархии хоккея верно обратное.

Также: ключевые слова без пространства имен могут быть помещены в независимые иерархии, но не в глобальную иерархию. Итак,

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

будет работать, но для глобальной иерархии эти ключевые слова должны быть в пространстве имен:

(derive :nspace/a :nspace/b)

, где nspace - некоторое пространство имен. (Интересно, что это пространство имен на самом деле не нужно где-либо объявлять.)

Таким образом, независимые иерархии следует использовать, когда требуется более одной иерархии или когда иерархия требует значительного изменения во время выполнения. Кроме того, если нам нужна иерархия для голых ключевых слов, требуется независимая иерархия.

5
ответ дан 2 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: