Это заставляет меня задаться вопросом, почему не 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]
Но, честно говоря, получение всех чтобы скрепить их выражения кроме случаев, когда они действительно хотели двойного замещения (и выражение во время выполнения компиляции) считается лучше.
Двойная замена почти всегда является признаком ошибки безопасности, и это всегда указывает на проблему с производительностью; практически всегда есть лучший (более быстрый, безопасный) способ сделать это. Подтянуть ваши выражения. Это безопаснее и быстрее и очень легко сделать: что не нравится?
См. [Wiki] (http://wiki.tcl.tk/10225) в разделе «Искусство непривязанных выражений», в котором упомянуто несколько случаев (хотя не все без обходных решений). – Jerry