2015-09-10 2 views
1

Я читал прекрасное объяснение Дональда Стиля о том, почему вы должны brace your expr.Почему компилятор автоматически не поддерживает expr?

Это заставляет меня задаться вопросом, почему компилятор tcl автоматически не скопирует {}expr? Каковы условия, при которых эта автоматическая фиксация не сработает?

+1

См. [Wiki] (http://wiki.tcl.tk/10225) в разделе «Искусство непривязанных выражений», в котором упомянуто несколько случаев (хотя не все без обходных решений). – Jerry

ответ

3

Это заставляет меня задаться вопросом, почему не TCL компилятор автоматически скобки {}expr?

На самом деле это произошло во время некоторых альфов для 8.0. Это было устранено, потому что более широкое сообщество абсолютно ненавидило его. Основной язык Tcl - 12 правил на странице руководства Tcl (n) - остается очень маленьким и простым, и он применяется равномерно к всем.

Нет особых случаев. Это то, что хотят программисты Tcl.

Если я правильно помню, автообучение было особенно рассмотрено для if и while. С if это связано с тем, что исключение брекетов для теста результата команды было особенно распространенной практикой с Tcl 7, потому что оно было быстрее (механизм выражения был довольно смущающим медленным). С while это было связано с тем, что отсутствие брекетов было распространенной ошибкой пользователя.

Каковы условия, при которых эта автоматическая фиксация не сработает?

Ну, это было бы заметно в чем-то вроде этого:

set a 1 
set b 2 
set op + 
set c [expr $a$op$b] 

Прямо сейчас, что устанавливает c в 3. С автоматической привязкой это будет синтаксическая ошибка (поскольку в грамматике выражения нет ничего, что можно было бы сделать с тремя переменными в строке).Была предложена работа вокруг:

set c [eval expr $a$op$b] 

Но, честно говоря, получение всех чтобы скрепить их выражения кроме случаев, когда они действительно хотели двойного замещения (и выражение во время выполнения компиляции) считается лучше.

Двойная замена почти всегда является признаком ошибки безопасности, и это всегда указывает на проблему с производительностью; практически всегда есть лучший (более быстрый, безопасный) способ сделать это. Подтянуть ваши выражения. Это безопаснее и быстрее и очень легко сделать: что не нравится?

4

Некоторые случайные мысли об этом ...

  • Одним из преимуществ языка является то, что оценка регулируется небольшим количеством правил, которые применяются единообразно. Чтобы аргументы в expr автоматически были скопированы, это означало бы, что в правилах для этой команды должно быть исключение.
  • Это также означает, что интерпретатор должен быть переписан, поскольку он оценивает аргументы, прежде чем он определит, с какой командой он имеет дело. Команда expr может быть переименована или сглажена, что затрудняет интерпретацию интерпретатора при аутсорсинге.
  • Это означало бы, что если бы кто-то хотел двойной оценки аргументов или хотел построить аргумент таким образом, который не соответствует токенам выражений, им придется обойти автоматическую привязку.
  • Это означало бы возможные несовместимости с большим количеством старого кода.

Чтобы переводчик как «водитель заднего сиденья» на самом деле не является способом Tcl.

Смежные вопросы