Tcl(7tcl)

NAME
Tcl - 語言語法總結.

描述 DESCRIPTION

 下面的規則定義 Tcl 語言的語法和語義:

[1] 一個 Tcl 指令碼是一個包含一個或多個命令的字串。除了象後面描述的那樣被引用(quote)之外，分號(Semi-colon)和換行(newline)是命令分隔符。除了被引用(quote)之外，右方括號(Close bracket)在命令替換期間是命令終結符(見後)。

[2] 命令的求值分兩步。 首先，Tcl 直譯器把命令分解成字 (words) 並按下面描述的那樣完成替換。對所有命令都以同樣的方式進行替換。第一個字用於定位完成這個命令的一個命令過程，接著命令的所有的字被傳遞給命令過程。命令過程以它喜歡的任何方式自由的解釋命令的字，如一個整數、變數名、列表、或 Tcl 指令碼。不同的命令以不同的方式解釋它們的字。

[3] 一個命令的字(word)由白空格(不包括作為命令分隔符的換行)來分隔。

[4] 如果一個字的第一個字元是雙引號 (``"'',double-quote) 則字終結於下一個雙引號字元。如果是分號，右方括號，或白空格字元(包括換行)出現在引號之間則被作為普通的字元對待並包含在字裡。象下面描述的那樣，在引號之間的字元上進行命令替換、變數替換、和反斜槓替換。雙引號不作為字的一部分而保留。

[5] 如果一個字的第一個字元是左花括號 (“{”,open brace) 則字終結於相匹配的右花括號 (“}”,close brace)。花括號在字中巢狀: 對於每個增加的(additional)左花括號都必須有一個增加的右花括號(但是，如果 在一個字中的左括號或右括號被用一個反斜槓引用起來則在匹配右花括號時不計在內)。除了下面描述的反斜槓-換行替換之外，在花括號之間的字元上不進行替換，對分號、換行、右方括號、或白空格不做特殊的解釋。字由外側的花括號之間的字元精確的組成，不包括花括號自身。

[6] 如果一個字包含一個左方括號 (“[”,open bracket ) 則 Tcl 進行命令替 換 (command substitution)。為此將遞迴呼叫 Tcl 直譯器來把左方括號後 面的字元作為一個 Tcl 指令碼處理。指令碼可以包含任意數目的命令並且必須用一個 右方括號 (“]”,close bracket) 來終結。指令碼的結果(例如，最後的一條命令的結 果)將被替換到字中方括號和它們中間所有字元的位置上。在一個單一的字中可以 有任意數目的命令替換。在由花括號包起來(enclose)的字上不進行命令替換。

[7] 如果一個字包含一個美元符(``$'')則 Tcl 進行變數替換 (variable substitution): 字中的美元符號和跟隨的字元被一個變數的值所替換。接受下面幾種形式(form)的變數替換:

    $name
        Name 是一個標量(scalar)變數的名字；名字終結於任何不是字母、數字、或下劃線(underscore)的字元。

    $name(index)
        Name 給出一個數組變數的名字，index 給出在這個陣列中的一個元素的名字. Name 只能包含字母、數字、和下劃線。index 的字元將被進行命令替換、變數替換、和反斜槓替換。

    ${name}
        Name 是一個標量( scalar)變數的名字。它可以包含除了右括號之外的任何字元。

    一個單一的字中可以有任意數目的變數替換。在由花括號包起來(enclose)的字上不進行命令替換。

[8] 如果在一個字中出現一個反斜槓(“\”)則發生反斜槓替換 (backslash substitution)。除了下面描述的這些情況之外，反斜槓 (backslash)被刪除 (drop)，跟隨的字元被作為普通字元對待。這就允許在字中包含象雙引號、右方括 號、和美元符號等字元而不觸發特殊的處理。下表列出的要特殊處理的反斜槓序列 ，跟著的是每個序列被替換成的值。

    \a  聲音警告 (振鈴) (0x7).

    \b  退格 (0x8).

    \f  換頁 (0xc).

    \n  換行 (0xa).

    \r  回車 (0xd).

    \t  跳格(Tab) (0x9).

    \v  縱向跳格 (0xb).

    \<newline>whiteSpace
        一個單一的空格字元替換反斜槓、換行和在換行後面的所有空格和跳格。這個反斜槓序列是唯一一個在命令被實際分析之前在一次獨立的預處理(pre- pass)中被替換的。這意味著即使在花括號之間這個替換也發生，並且不在花括號和引號之間時作為結果的空格被作為一個字分隔符對待。

    \\  反斜槓 (``'').

    \ooo
        數字ooo(它們中的一個、兩個、或三個)給出一個八進位制數，是要插入的 Unicode 字元的八位值。 Unicode 字元的高位(upper)將是 0.

    \xhh
        十六進位制數 hh 給出要插入的 Unicode 字元的八位值。可以提供任意數目的十六進位制數字 ；但除了最後兩位之外都被忽略(結果總是一個一位元組的數量)。Unicode 字元的高位(upper)將是 0.

    \uhhhh
        十六進位制數 hhhh (它們中的一個、兩個、三個、或四個)給出要插入的 Unicode 字元的十六位值。

    除了前面描述的反斜槓-換行，在由花括號包起來(enclose)的字上不進行反斜槓替換。

[9] 如果一個升音符 “#” (sharp / hash) 出現在 Tcl 希望是一個命令的第一個字的地方(point),則升音符和其後面跟隨的、一直到下一個換行的所有字元，被作為一個註釋對待並被忽略。註釋字元只有出現在一個命令開始時才有意義(significance)。

[10]
    每個字元作為建立的一個命令的某個字的一部分，被 Tcl 直譯器精確的處理一次。例如，如果發生了變數替換則在變數的值上不進行進一步的替換；值被原封不動的(verbatim)插入字中。如果發生了命令替換則巢狀的命令被對 Tcl 直譯器的遞迴呼叫整個的處理；在做遞迴呼叫之前不進行替換並且對巢狀的指令碼的結果不進行額外的(additional)替換。

[11]
    替換不影響一個命令的字邊界(boundary)。例如，即使變數的值包含空格，在變數替換期間變數的整個的值成為一個單一的字的一部分。

[中文版維護人]
寒蟬退士

[中文版最新更新]
2001/06/21

《中國 Linux 論壇 man 手冊頁翻譯計劃》:
http://cmpp.linuxforum.net

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh