Подтвердить что ты не робот

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

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

(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))

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

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

4b9b3361

Ответ 1

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

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

    (def basketball-hierarchy (вывод (make-hierarchy): gretzky: jordan))

    (def hockey-hierarchy (выводить (make-hierarchy): jordan: gretzky))

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

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

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

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

(derive :nspace/a :nspace/b)

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

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