代码之家  ›  专栏  ›  技术社区  ›  Vahagn

TCL 8.3:表达式“a eq b”中的语法错误

  •  1
  • Vahagn  · 技术社区  · 14 年前

    我有问题 eq

    % expr { "a" eq "b" }
    

    返回如下错误消息:

    syntax error in expression "a eq b"
    

    我试图通过添加一个 interp alias 在这一切之前:

    interp alias {} eq {} ==
    

    但似乎没有效果。

    有什么办法 情商 的别名 == 情商 陈述人 声明?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Bryan Oakley    14 年前

    这个 eq ne TCL8.4中引入了运算符。见 Changes in Tcl/Tk 8.4 在Tcler的wiki上。无法使“eq”成为表达式中“==”的别名。尝试使用alias命令只会创建一个名为 情商 不管命令是什么 == == ).

    如果您必须找到一种方法来实现这一点,那么在您的8.3解释器中,您可以将expr重命名为其他内容(例如:_expr),然后在调用重命名的expr命令之前创建自己的expr命令来执行字符串替换。这是充满风险的,因为您必须确保只替换运算符,而不是要比较的数据。

        2
  •  1
  •   Carlos Tasada    14 年前

    我甚至不确定这段代码在tcl 8.5中是否能正常工作

    首先确保expr位于大括号之间:

    % expr {"a" eq "b"}
    

    别名允许您为命令创建别名,但eq不是命令,它是 expr 命令,所以你真的需要创建自己的 proc expr args 包装纸。

    为什么需要使用TCL8.3?这是一个很旧的版本。

        3
  •  0
  •   Donal Fellows    14 年前


    也就是说

    现在,对于Tcl 8.3,其功能相当于 eq string equal 命令(在8.4中,它们实际上编译为相同的字节码;一个是另一个的捷径)。这意味着:

    if {"a" eq "b"} {...
    

    if {[string equal "a" "b"]} {...
    

    但是如果你 一定地

    if {"a" == "b"} {...
    

    Tcl的任何版本(当然不是8.6版本,这是当前的开发/测试版)中的别名操作符机制。


    紧握的手

    正如布赖恩所说,你可以自己编写 expr (和 if for while )它有这个扩展的功能,但这需要做很多工作(例如,几个月包括所有的测试,尽管您可能可以重用Tcl 8.4中的测试套件来提供帮助),而且它只是为了让您可以使用一个已知已经过时的Tcl版本。(我不知道里面有没有安全问题,你付不起我足够的钱让我想知道。)你最好付TDK的钱。