在无支撑的表达中的白色空间

时间:2016-10-04 03:59:52

标签: tcl

一次有趣的遭遇:

set v "\{a b\}"
expr $v eq \{a b\}

表达式命令按预期返回true。但以下也会返回true:

set v "\{a b\}"
expr $v eq \{a      b\}

基本上,\{ab\}之间的空格数会被忽略。

我知道TCL表达式应该支持参数。

我知道没有人会认真编写这样的代码。

我还可以猜测发生了什么:

  1. 在脚本级解析时,空格仅用作单词分隔,一个或多个空格具有相同的效果。
  2. 当涉及到命令expr时,它无法访问" raw"脚本,它只知道有两个单词,{ab},由一些空格分隔
  3. 因此只使用了一个空格。
  4. 但从TCL作为编程语言的角度来看,这是一个错误吗?

1 个答案:

答案 0 :(得分:2)

Tcl语法的第三条规则是

  

命令的单词由空格分隔(换行符除外,       这是命令分隔符。)

(命令名和参数字符串是单词。)

expr文档中的第一个条款是

  

连接args(在它们之间添加分隔符空格)

所以会发生的事情是Tcl解析器将字符串expr $v eq \{a b\}分成五个单词,丢弃它们之间的空白字符。然后expr命令将其四个参数连接成一个字符串,每对之间有一个分隔符空格。

与您在字符串上执行list mutation命令时看到的基本相同:

% set a {a    b c}
a    b c
% lappend a d
a b c d

文档: exprSummary of Tcl language syntax