TCL是如何做到的\&引用;操作员是否接受键盘输入?

TCL是如何做到的\&引用;操作员是否接受键盘输入?,tcl,Tcl,我对反斜杠运算符感到困惑,因为它在以下示例中使用: foreach op {+ - * / %} {proc $op {a b} "expr {\$a $op \$b}"} 当反斜杠位于大括号内时,将执行键盘输入(in)。当我删除反斜杠时,错误消息是“无法读取”a:没有这样的变量” 谷歌搜索这篇文章,一次又一次地告诉我关于转义字符和换行符。此上下文中的反斜杠运算符是不同的:\$a如何接受键盘输入?我应该用谷歌搜索“TCL反斜杠操作符”以外的东西吗?你的观察结果(或你用来描述它的语言)不正确。反

我对反斜杠运算符感到困惑,因为它在以下示例中使用:

foreach op {+ - * / %} {proc $op {a b} "expr {\$a $op \$b}"}
当反斜杠位于大括号内时,将执行键盘输入(in)。当我删除反斜杠时,错误消息是“无法读取”a:没有这样的变量”

谷歌搜索这篇文章,一次又一次地告诉我关于转义字符和换行符。此上下文中的反斜杠运算符是不同的:\$a如何接受键盘输入?我应该用谷歌搜索“TCL反斜杠操作符”以外的东西吗?

你的观察结果(或你用来描述它的语言)不正确。反斜杠不接受键盘输入。它被用作转义字符,仅此而已。在这种情况下,它的行为没有什么特别之处

让我们先看看代码试图实现什么。它试图创建如下过程:

proc + {a b} {
    expr {$a + $b}
}

proc - {a b} {
    expr {$a - $b}
}
。。。等等只是,它是在一个循环中进行的,在这个循环中,操作符和proc名称都在变量中

如果将原始代码拆分为几行,则可以更容易地可视化正在发生的事情:

foreach op {+ - * / %} {
    proc $op {a b} "expr {\$a $op \$b}"
}
请注意,循环内部是一个几乎正常的过程定义。但是,它没有使用大括号来定义程序体(
proc$op{abb}{…}
),而是使用双引号(
proc$op{abb}…
)。因为它使用双引号,所以在
foreach
命令运行时,将对过程主体中的所有内容进行求值。这就是为什么没有名为“a”的变量会出现错误。foreach循环中没有定义“a”,也没有定义“b”。仅定义了“op”

为了防止在foreach命令运行时替换
$a
,反斜杠用于转义
$
的特殊含义。因此,
“expr{\$a$op\$b}”
变为
expr{$a+$b}
(或
-
,或
*
等)

为什么要这样做?想象一下,如果proc语句使用更传统的花括号:

foreach op {+ - * / %} {
    proc $op {a b} {
        expr {$a $op $b}
    }
在这种情况下,
$a
$b
只是正常过程中的正常变量。到现在为止,一直都还不错。然而,有一个问题。注意,
$op
?proc不知道
$op
是什么,因此如果您实际运行上述代码,然后尝试使用创建的新proc之一,您将得到一个名为
op
的未知变量的错误

因此,存在一个冲突:您希望
$a
$b
按字面意思是
$a
$b
,但希望
$op
被循环中的
$op
值替换。正当因此,在本例中,编写代码的人决定使用双引号而不是大括号来定义proc——这是完全合法的,尽管有些不常见。这意味着在foreach运行时,将对进程体中的每个变量进行求值。这对
$op
很好,但对
$a
$b
不太好。因此,为了在foreach运行时保持这些变量未展开,美元符号被转义

因此,当foreach运行时,它会创建一个proc,其主体看起来像
expr{$a+$b}
expr{$a-$b}
,依此类推。反斜杠不接受键盘输入。它被用作转义字符,仅此而已。在这种情况下,它的行为没有什么特别之处

让我们先看看代码试图实现什么。它试图创建如下过程:

proc + {a b} {
    expr {$a + $b}
}

proc - {a b} {
    expr {$a - $b}
}
。。。等等只是,它是在一个循环中进行的,在这个循环中,操作符和proc名称都在变量中

如果将原始代码拆分为几行,则可以更容易地可视化正在发生的事情:

foreach op {+ - * / %} {
    proc $op {a b} "expr {\$a $op \$b}"
}
请注意,循环内部是一个几乎正常的过程定义。但是,它没有使用大括号来定义程序体(
proc$op{abb}{…}
),而是使用双引号(
proc$op{abb}…
)。因为它使用双引号,所以在
foreach
命令运行时,将对过程主体中的所有内容进行求值。这就是为什么没有名为“a”的变量会出现错误。foreach循环中没有定义“a”,也没有定义“b”。仅定义了“op”

为了防止在foreach命令运行时替换
$a
,反斜杠用于转义
$
的特殊含义。因此,
“expr{\$a$op\$b}”
变为
expr{$a+$b}
(或
-
,或
*
等)

为什么要这样做?想象一下,如果proc语句使用更传统的花括号:

foreach op {+ - * / %} {
    proc $op {a b} {
        expr {$a $op $b}
    }
在这种情况下,
$a
$b
只是正常过程中的正常变量。到现在为止,一直都还不错。然而,有一个问题。注意,
$op
?proc不知道
$op
是什么,因此如果您实际运行上述代码,然后尝试使用创建的新proc之一,您将得到一个名为
op
的未知变量的错误

因此,存在一个冲突:您希望
$a
$b
按字面意思是
$a
$b
,但希望
$op
被循环中的
$op
值替换。正当因此,在本例中,编写代码的人决定使用双引号而不是大括号来定义proc——这是完全合法的,尽管有些不常见。这意味着在foreach运行时,将对进程体中的每个变量进行求值。这对
$op
很好,但对
$a
$b
不太好。因此,为了在foreach运行时保持这些变量未展开,美元符号被转义

因此,当foreach运行时,它会创建一个proc,其主体看起来像
expr{$a+$b}
expr{$a-$b}
,等等