xlibs
в том же объеме, что и graphviz, но libXaw
нет, потому что он находится внутри набора xlibs
. Поэтому, чтобы иметь возможность передать его в качестве аргумента функции graphviz, вам необходимо явно указать inherit (xlibs) libXaw
. Это поведение, обозначенное скобками, уникально для ключевого слова inherit
.
Скобки в (import ../tools/graphics/graphviz)
являются просто общим соглашением для обозначения порядка оценки. import
- это функция, которая принимает один аргумент path
. Файл в ../tools/graphics/graphviz
содержит единственную функцию, которая принимает в качестве аргумента набор атрибутов. Таким образом, скобки означают, что порядок оценки должен быть (1) импортировать функцию в path
, затем (2) применить к этой функции набор атрибутов {...}
.
Редактировать: @danbst указал, что в этом случае скобки в
import ../tools/graphics/graphviz
не нужны. Причиной этого является то, что оценка
import ../tools/graphics/graphviz
возвращает функцию, которая затем вызывается с помощью набора
{ ... }
.
Необходимость кронштейнов может быть продемонстрирована с использованием тех же значений, что и аргументы для этой функции typesOfArgs = one: two: with builtins; "${typeOf one} and ${typeOf two}"
, которая возвращает строку. typesOfArgs (import ../tools/graphics/graphviz) { }
будет вычисляться "lambda and set"
, но без скобок интерпретатор будет оценивать typesOfArgs import ../tools/graphics/graphviz
к "lambda and path"
, а затем попытаться вызвать эту строку в виде функции с аргументом { }
, который привел бы к error: attempt to call something which is not a function but a string
без скобок интерпретатор будет предположим, что вы хотите вызовите функцию
import
с двумя аргументами
path
и
{ ... }
, что будет ошибкой.
Очень хорошее объяснение. Благодаря! – Ben