为什么编译器不自动支撑 expr?
Why doesn't compiler automatically brace expr?
我正在阅读 Donal Fellows 对您为什么应该 brace your expr
的精彩解释。
这让我想知道为什么 tcl 编译器不自动支撑 {}
和 expr
?这种自动支撑在什么情况下会失效?
关于这个的一些随机想法...
- 该语言的优势之一是评估由少量统一应用的规则控制。自动支撑
expr
的参数意味着此命令的规则必须有例外。
- 这也意味着必须重写解释器,因为它会在确定正在处理的命令之前评估参数。
expr
命令可以重命名或别名,使解释器更难确定何时自动支撑。
- 这意味着如果有人想要对参数进行双重评估,或者想要以不直接匹配表达式标记的方式构造参数,他们将不得不解决自动支撑问题。
- 这意味着可能与许多旧代码不兼容。
将解释器作为 "back seat driver" 并不是真正的 Tcl 方式。
It makes me wonder why doesn't the tcl compiler automatically brace {}
the expr
?
它实际上是在 8.0 的某些 alpha 期间这样做的。它被删除是因为更广泛的社区绝对讨厌它。核心 Tcl 语言 — Tcl(n) 手册页上的 12 条规则 — 保持非常小和简单,并且统一应用于 everything.
没有特殊情况。 那 是大多数 Tcl 程序员想要的。
如果我没记错的话,if
和 while
特别考虑了自动支撑。对于 if
,这是因为在 Tcl 7 中省略大括号来测试命令结果是一种特别常见的做法,因为它更快(表达式引擎慢得令人尴尬)。对于 while
,这是因为省略大括号是一个常见的用户错误。
What are conditions under which this automatic bracing will fail?
嗯,在这样的情况下会很明显:
set a 1
set b 2
set op +
set c [expr $a$op$b]
现在,c
设置为 3
。使用自动支撑,这将是一个语法错误(因为表达式语法对连续三个变量没有任何作用)。提出了一个解决方法:
set c [eval expr $a$op$b]
但坦率地说,让每个人都支持他们的表达式,除非他们真的想要双重替换(和运行时表达式编译)被认为更好。
双重替换几乎总是表明存在安全漏洞,并且始终表明存在性能问题;实际上总是有更好(更快、更安全)的方法来做到这一点。 振作起来。它更安全、更快速且非常容易:有什么不喜欢的?
我正在阅读 Donal Fellows 对您为什么应该 brace your expr
的精彩解释。
这让我想知道为什么 tcl 编译器不自动支撑 {}
和 expr
?这种自动支撑在什么情况下会失效?
关于这个的一些随机想法...
- 该语言的优势之一是评估由少量统一应用的规则控制。自动支撑
expr
的参数意味着此命令的规则必须有例外。 - 这也意味着必须重写解释器,因为它会在确定正在处理的命令之前评估参数。
expr
命令可以重命名或别名,使解释器更难确定何时自动支撑。 - 这意味着如果有人想要对参数进行双重评估,或者想要以不直接匹配表达式标记的方式构造参数,他们将不得不解决自动支撑问题。
- 这意味着可能与许多旧代码不兼容。
将解释器作为 "back seat driver" 并不是真正的 Tcl 方式。
It makes me wonder why doesn't the tcl compiler automatically brace
{}
theexpr
?
它实际上是在 8.0 的某些 alpha 期间这样做的。它被删除是因为更广泛的社区绝对讨厌它。核心 Tcl 语言 — Tcl(n) 手册页上的 12 条规则 — 保持非常小和简单,并且统一应用于 everything.
没有特殊情况。 那 是大多数 Tcl 程序员想要的。
如果我没记错的话,if
和 while
特别考虑了自动支撑。对于 if
,这是因为在 Tcl 7 中省略大括号来测试命令结果是一种特别常见的做法,因为它更快(表达式引擎慢得令人尴尬)。对于 while
,这是因为省略大括号是一个常见的用户错误。
What are conditions under which this automatic bracing will fail?
嗯,在这样的情况下会很明显:
set a 1
set b 2
set op +
set c [expr $a$op$b]
现在,c
设置为 3
。使用自动支撑,这将是一个语法错误(因为表达式语法对连续三个变量没有任何作用)。提出了一个解决方法:
set c [eval expr $a$op$b]
但坦率地说,让每个人都支持他们的表达式,除非他们真的想要双重替换(和运行时表达式编译)被认为更好。
双重替换几乎总是表明存在安全漏洞,并且始终表明存在性能问题;实际上总是有更好(更快、更安全)的方法来做到这一点。 振作起来。它更安全、更快速且非常容易:有什么不喜欢的?