Tcl 中括号和空格字符的使用

Qua*_*xE7 3 tcl

我仍然对 Tcl 中括号即 () [] 和 {} 的用法感到困惑。我总是发现使用了错误的括号,在需要使用括号时错过了括号,或者使用了太多括号。除此之外,我还对 Tcl 给我不同的结果感到困惑,具体取决于是否存在空格字符(在数学表达式中),以及如果我连续使用了多个空格字符。

有人可以给我一些我必须牢记的基本规则,以摆脱困境吗?在 C 和其他一些语言中,括号的使用一直很简单,但在这里它们完全不同。

Don*_*ows 7

在您所看到的级别上,Tcl与您曾经使用过的任何其他语言都非常不同。Tcl 的核心由Tcl(n) 手册页定义,其中指出(除其他外):

\n
    \n
  • 空格分隔单词。每个命令都将其参数视为单词序列。换行符和分号分隔命令调用;它们完全等价,但好的风格是使用换行符而不是分号。
  • \n
  • {大括号}主要用于引用文本,以便将其传递给命令而不对其进行替换或单词分隔。它们筑巢得当。$在某些情况下,大括号还用于进行变量替换:这是一种罕见的用途。
  • \n
  • "双引号"用于引用文本,以便将其传递给应用替换的命令但不进行单词分隔。
  • \n
  • [括号]是命令替换。它们被替换为运行括号内脚本的结果。该脚本通常是单个命令。
  • \n
  • (括号)只有一种基本语言用途:用于(关联)数组元素。因此,$a(b)是一个将使用数组b中元素的值的变量替换a
  • \n
\n

人们所说的 Tcl 的其余部分实际上只是一个标准库,一组帮助您入门的命令。有些是根本性的。例如:

\n
    \n
  • if是一个条件命令,如果条件为真,则评估分支(脚本)。为了使其有意义,在评估和测试条件之前不得评估分支;这几乎需要将其放在大括号中。

    \n
  • \n
  • while是一个循环命令,您不仅想要支撑它的主体(可能会一遍又一遍地计算),而且您还想将条件表达式放在大括号中,并且您肯定希望重新计算它每次循环。

    \n
  • \n
  • proc是一个创建您自己的自定义命令的命令。程序的主体肯定是您稍后想要评估的内容;它用大括号括起来。

    \n
  • \n
  • expr是通用表达式求值命令。在所有正常情况下,您都需要将其表达式放在大括号中,以便可以编译代码并且不会出现双重替换问题。请注意,表达式经常大量使用括号:它们在表达式语法中具有附加含义。特别是,除了数组元素查找之外,它们还用于函数调用和分组。

    \n

    请注意,ifwhile还使用相同的表达式评估引擎。他们只是使用表达式的结果来决定要做什么。

    \n
  • \n
\n

范围是由命令决定的问题。处理引入范围的常用命令是procnamespace eval这与 C、C++、Java、C# 或 Javascript 完全不同;他们有不同的规则。除非您明确指出,否则变量对于其过程来说是局部的。

\n
\n

社区实践是这样进行调用:

\n
if { $foo(bar) > (17 + $grill) * 7 } {\n    # This is a comment; it lasts to the end of the line\n    puts "the foobar $foo(bar) is too large"\n    set foo(bar) [ComputeSmallerValue $grill]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

也就是说,裸词 (ifputs) 不加引号,表达式和内部脚本用大括号括起来,括号在有意义的地方使用,但大多数用于数组和表达式,空格分隔所有单词,为了清晰起见,内部脚本缩进(通常为 4)(它不\ 没有语义,但它确实有助于阅读),并且 \xe2\x80\x9cblocks\xe2\x80\x9d 使用埃及大括号,这样您就不必在整个地方添加反斜杠。

\n

您不必遵守这些规则(它们是指导方针,而不是法律),但如果您这样做,它们会让您的生活更轻松。有时你确实需要打破规则,但你应该知道要小心。

\n