Почему xquery допускает повторное объявление локальной переменной?

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

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 ответ

Решение

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

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

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

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

Другие вопросы по тегам