Почему xquery допускает переопределение локальной переменной? - PullRequest
0 голосов
/ 26 апреля 2020

Это даже не вызовет предупреждения:

xquery version "3.1";
let $a := 1
let $a := 2
return $a
(: yields 2 in all runtimes I tested :)

Почему (функциональный) язык программирования допускает повторные объявления переменных? Я действительно хочу получить обоснование этого. Я полагаю, что отклонение этого на этапе компиляции позволило бы добиться более агрессивной оптимизации. Поскольку локальные переменные также известны дочерним областям, это просто оставляет больше места для трудноуловимых ошибок. JavaScript имел это годами с var и, наконец, избавился от него, введя let и const.

. Вот пример, где может быть трудно отследить значения.

xquery version "3.1";
let $f := function ($c) {
  (: some code ... :)
  let $b := $a
  let $a := 2
  let $c := $b
  (: some more code ... :)
  return ($a, $b, $c)
}
let $a := 1
return ($a, $f($a), $a)

Вы можете сначала угадать, прежде чем оценивать.

1 Ответ

1 голос
/ 26 апреля 2020

Вопросы «почему» всегда трудны, потому что вы можете догадаться, почему дизайнеры могли принять решения, которые они приняли, но обычно невозможно получить историческое подтверждение их рассуждений. Если вы хотите исследовать историю, архивы рабочей группы доступны по адресу https://lists.w3.org/Archives/Public/public-xsl-query/, но средства поиска не особенно хороши, так что вам придется сократить свою работу. Но даже если вы найдете соответствующее обсуждение в протоколе, оно, вероятно, будет записывать только решение, а не подробные аргументы.

XSLT 1.0 не позволил повторно объявить локальные переменные, и мне кажется, Напомним, что люди XSL вообще были против этого, в то время как люди XQuery были в целом за. Есть аргументы в обе стороны. Основным аргументом для его разрешения, вероятно, является аргумент «без ненужных ограничений»: вы не запрещаете что-либо, если оно имеет четко определенную семантику. Аргумент за запрещение этого состоял в том, что люди, вероятно, злоупотребят и неправильно поймут это; они думают, что две переменные должны как-то быть связаны, если они имеют одинаковое имя.

Аналогия Javascript не особенно хороша, потому что переменные в процедурном языке довольно сильно отличаются от переменных в функционале language.

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

...