Когда и как должны использоваться независимые иерархии в clojure? - PullRequest
12 голосов
/ 10 июня 2010

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

(derive ::child ::parent)

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

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

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

Объединение особенно полезно, поэтому я делаю это:

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

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

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

1 Ответ

5 голосов
/ 16 июня 2010

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

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

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

    (определение хоккейной иерархии (производная (make-иерархия): jordan: gretzky))

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

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

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

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

(derive :nspace/a :nspace/b)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...