Tcl 为什么';t编译器自动大括号表达式?

Tcl 为什么';t编译器自动大括号表达式?,tcl,expr,Tcl,Expr,我在读Donal Fellows关于你为什么应该这样做的精彩解释 这让我想知道,为什么tcl编译器不能自动将{}与expr分开?这种自动支撑在什么情况下会失效?关于这方面的一些随机想法 该语言的优点之一是,评估由少量统一应用的规则控制。如果要将expr的参数自动置于大括号中,则意味着此命令的规则中必须存在异常 这还意味着必须重写解释器,因为解释器在确定处理哪个命令之前会对参数进行求值。expr命令可以重命名或使用别名,使解释器更难确定何时自动竞速 这意味着,如果有人想要对参数进行双重计算,或者

我在读Donal Fellows关于你为什么应该这样做的精彩解释


这让我想知道,为什么tcl编译器不能自动将
{}
expr
分开?这种自动支撑在什么情况下会失效?

关于这方面的一些随机想法

  • 该语言的优点之一是,评估由少量统一应用的规则控制。如果要将
    expr
    的参数自动置于大括号中,则意味着此命令的规则中必须存在异常
  • 这还意味着必须重写解释器,因为解释器在确定处理哪个命令之前会对参数进行求值。
    expr
    命令可以重命名或使用别名,使解释器更难确定何时自动竞速
  • 这意味着,如果有人想要对参数进行双重计算,或者想要以一种不直接匹配表达式标记的方式构造参数,那么他们就必须绕过自动支撑
  • 这意味着可能与许多旧代码不兼容

让口译员作为“后座司机”并不是Tcl真正的方式。

关于这一点的一些随机想法

  • 该语言的优点之一是,评估由少量统一应用的规则控制。如果要将
    expr
    的参数自动置于大括号中,则意味着此命令的规则中必须存在异常
  • 这还意味着必须重写解释器,因为解释器在确定处理哪个命令之前会对参数进行求值。
    expr
    命令可以重命名或使用别名,使解释器更难确定何时自动竞速
  • 这意味着,如果有人想要对参数进行双重计算,或者想要以一种不直接匹配表达式标记的方式构造参数,那么他们就必须绕过自动支撑
  • 这意味着可能与许多旧代码不兼容
让口译员作为“后座司机”并不是Tcl真正的方式

这让我想知道,为什么tcl编译器不能自动将
{}
expr
分开

在8.0版本的一些alphas中,它实际上是这样做的。它被移除是因为更广泛的社区对它深恶痛绝。核心的Tcl语言——Tcl(n)手册页面上的12条规则——非常小和简单,并且它统一应用于所有内容

没有特殊情况。这就是大多数Tcl程序员想要的

如果我没记错的话,在
If
while
中特别考虑了自动支撑。对于
if
,这是因为在测试命令结果时省略大括号是Tcl 7的一种特别常见的做法,因为它速度更快(表达式引擎的速度相当慢)。对于
,这是因为省略大括号是一个常见的用户错误

在什么情况下自动支撑会失效

好吧,在这样的事情上是很明显的:

set a 1
set b 2
set op +
set c [expr $a$op$b]
现在,这将
c
设置为
3
。如果使用自动支撑,这将是一个语法错误(因为表达式语法无法处理一行中的三个变量)。提出了一个变通办法:

set c [eval expr $a$op$b]
但坦率地说,让每个人都支持他们的表达式,除非他们真的需要双重替换(和运行时表达式编译)被认为是更好的

双重替换几乎总是表示存在安全缺陷,并且总是表示存在性能问题;实际上,总有更好(更快、更安全)的方法振作起来。这样更安全、更快,而且很容易做到:有什么不喜欢的

这让我想知道,为什么tcl编译器不能自动将
{}
expr
分开

在8.0版本的一些alphas中,它实际上是这样做的。它被移除是因为更广泛的社区对它深恶痛绝。核心的Tcl语言——Tcl(n)手册页面上的12条规则——非常小和简单,并且它统一应用于所有内容

没有特殊情况。这就是大多数Tcl程序员想要的

如果我没记错的话,在
If
while
中特别考虑了自动支撑。对于
if
,这是因为在测试命令结果时省略大括号是Tcl 7的一种特别常见的做法,因为它速度更快(表达式引擎的速度相当慢)。对于
,这是因为省略大括号是一个常见的用户错误

在什么情况下自动支撑会失效

好吧,在这样的事情上是很明显的:

set a 1
set b 2
set op +
set c [expr $a$op$b]
现在,这将
c
设置为
3
。如果使用自动支撑,这将是一个语法错误(因为表达式语法无法处理一行中的三个变量)。提出了一个变通办法:

set c [eval expr $a$op$b]
但坦率地说,让每个人都支持他们的表达式,除非他们真的需要双重替换(和运行时表达式编译)被认为是更好的

双重替换几乎总是表示存在安全缺陷,并且总是表示存在性能问题;实际上,总有更好(更快、更安全)的方法支撑你的表达。更安全、更快、更容易做到:什么是不喜欢的?

请参阅“无支撑表达的艺术”一节,其中提到了几个案例(尽管并非所有案例都没有解决办法)。请参阅“无支撑表达的艺术”一节,其中提到了几个案例