Why doesn't compiler automatically brace expr?
我正在阅读 Donal Fellows 关于为什么你应该支撑你的
这让我想知道为什么 tcl 编译器不自动将
关于这个的一些随机想法......
-
该语言的优势之一是评估由少数统一应用的规则控制。让
expr 的参数自动括起来意味着该命令的规则中必须有一个例外。 -
这也意味着解释器必须被重写,因为它在确定它正在处理的命令之前评估参数。
expr 命令可以重命名或别名,使解释器更难确定何时进行自动大括号。 - 这意味着如果有人想要对参数进行双重评估,或者想要以不直接匹配表达式标记的方式构造参数,他们将不得不绕过自动支撑。
- 这意味着可能与许多旧代码不兼容。
让解释器成为"后座司机"并不是真正的 Tcl 方式。
It makes me wonder why doesn't the tcl compiler automatically brace
{} theexpr ?
它实际上在 8.0 的一些 alpha 版本中这样做了。它被删除是因为更广泛的社区绝对讨厌它。核心 Tcl 语言 a€"Tcl(n) 手册页上的 12 条规则 a€" 保持极小和简单,并且统一应用于所有内容。
没有特殊情况。这是大多数 Tcl 程序员想要的。
如果我没记错的话,
What are conditions under which this automatic bracing will fail?
嗯,在这样的情况下会很明显:??
1 2 3 4 | set a 1 set b 2 set op + set c [expr $a$op$b] |
现在,将
1 | set c [eval expr $a$op$b] |
但坦率地说,让每个人都支持他们的表达式,除非他们真的想要双重替换(和运行时表达式编译)被认为是更好的。
双重替换几乎总是表明存在安全漏洞,也总是表明存在性能问题;几乎总是有更好(更快,更安全)的方法来做到这一点。支撑你的表达。它更安全、更快捷、更容易做到:有什么不喜欢的?