Кукольный DSL: порядок не имеет значения?

Согласно документации Puppet:

Порядок не имеет значения в декларативном языке.

Если это так, то почему этот кусок кода работает:

class myserver {
  $package_to_install = 'libcapture-tiny-perl'
  package {
   $package_to_install: ensure => present;
  }
}

но этот код не работает:

class myserver {
  package {
   $package_to_install: ensure => present;
  }
  $package_to_install = 'libcapture-tiny-perl'
}

Если порядок имеет значение, то я понимаю, почему один работает, а другой нет, но поскольку порядок не имеет значения, почему они ведут себя по-разному?


person rlandster    schedule 20.06.2012    source источник


Ответы (1)


Отказ от ответственности: я являюсь одним из разработчиков Puppet.

Потому что наш язык, как утверждает наша документация, на самом деле не является декларативным. Он действительно заказан. :(

Оценка выполняется более или менее сверху вниз внутри класса или объявления. Однако продукт этой оценки является ресурсом в каталоге, а не оценкой каталога.

Думайте о DSL как о не совсем декларативном способе построения каталога, графа ресурсов, которые полностью декларативны в обработке.

person Daniel Pittman    schedule 20.06.2012
comment
У вас есть указатель на какой-нибудь документ Puppet Labs, в котором можно подробно объяснить, как язык компилируется и выполняется? - person rlandster; 21.06.2012
comment
К сожалению, нет, нет. Однако я добавил еще несколько объяснений в ответ. - person Daniel Pittman; 21.06.2012
comment
Таким образом, файл Puppet DSL предварительно компилируется обычным императивным способом в структуру, представляющую граф ресурсов, который не зависит от порядка (по модулю явных зависимостей). Это правильно? - person rlandster; 21.06.2012
comment
Грубо говоря, да. Это резюме вряд ли направит вас неправильно. - person Daniel Pittman; 21.06.2012