Ответ 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 - некоторое пространство имен. (Это пространство имен фактически не должно быть объявлено нигде, интересно.)
Таким образом, тогда независимые иерархии должны использоваться, когда требуется более чем одна иерархия или когда иерархия нуждается во значительном изменении во время выполнения. Кроме того, если нам нужна иерархия для открытых ключевых слов, требуется независимая иерархия.