Tcl語法簡介

xmuguoxin發表於2009-03-03

[Tcl的語法比這複雜的多,無疑需要長期的浸淫,轉載此篇文章權當拋磚引玉]

作為一種指令碼語言,Tcl具有簡單的語法.

cmd arg arg arg
一條Tcl命令由空格分割的單片語成. 其中, 第一個單詞是命令名稱, 其餘的是命令引數 .
$foo
$符號代表變數的值. 在本例中, 變數名稱是foo.
[clock seconds]
方括號執行了一個巢狀命令. 例如, 如果你想傳遞一個命令的結果作為另外一個命令的引數, 那麼你使用這個符號 . 在本例中, 巢狀命令是以秒為單位的當前時間秒數 .
"some stuff"
雙引號把片語標記為命令的一個引數. "$"符號和方括號在雙引號內仍被解釋 .
{some stuff}
大括號也把片語標記為命令的一個引數. 但是, 其他符號在大括號內不被解釋.

反斜線符號() 是用來引用特殊符號. 例如:n 代表換行. 反斜線符號也被用來關閉"$"符號 , 引號,方括號和大括號的特殊含義 .
--------------------------------------------------------------------------------

一個小例子
下面是Tcl中列印當前時間的命令. 它使用了三條Tcl命令 : set, clock, 和 puts. set 命令給變數賦值. clock 命令生成時間值 . puts 命令列印結果.

set seconds [clock seconds]
puts "The time is [clock format $seconds]"
注意在給變數賦值時並未使用$符號. 只有在使用變數時才使用$符號.在上個例子中, seconds 變數並不是必須的. 你能使用一句命令列印出當前時間:

puts "The time is [clock format [clock seconds]]"
--------------------------------------------------------------------------------
分組和替換
Tcl解析Tcl語法是透過以下三步: 引數分組, 結果替換和命令分派.

引數分組. Tcl需要決定怎樣組織命令的引數 . 在最簡單的情況中, 空格分隔了各引數 . 作為早期規定, 引號和括號使多個單詞成為一個引數 . 在上個例子中 , 雙引號使多個單詞成為puts命令的一個引數.

結果替換. 在引數分組後 , Tcl執行字串替換. Put命令中, 只是簡單地用變數 $foo 的值替換了foo, 用結果替換了括號命令. 替換是在分組之 後 後進行的. 這種次序使特別的值並未使命令結構變複雜.

命令分派. 在結果替換後, Tcl使用命令名稱作為關鍵字 ,查詢分派表,呼叫相應的C程式,來執行命令. . 你也可以在Tcl中開發命令程式. 在引數傳遞和錯誤處理中有一些簡單的約定.
--------------------------------------------------------------------------------
<wbr> <wbr>另一個例子
下面是另一個例子:

set i 0
while {$i < 10} {
<wbr> <wbr> puts "$i squared = [expr $i*$i]"
<wbr> <wbr> incr i
}

這裡, 大括號用來引數分組, 並沒進行任何替換. Tcl語法解析知道 while 命令沒有特別的地方,象對待其它命令一樣. while 命令的執行程式知道第一個引數是表示式, 第一個引數是多個Tcl命令 . 大括號把它分成兩個引數:邏輯表示式控制迴圈,命令在迴圈部分 .
我們看到了兩個數學表示式: 邏輯比較和乘法計算. while命令自動計算第一個引數值. 在其它場合時,你要明確使用 expr 命令來執行數學計算.
<wbr> <wbr>
--------------------------------------------------------------------------------
命令分派
最後,Tcl呼叫程式執行復雜的工作. 我們可以看到Tcl 使用 expr 命令來執行數學運算, puts 命令來執行輸出功能, set 命令來給變數賦值. 這些Tcl命令,是透過已在Tcl中註冊的C語言程式來執行的. C語言程式呼叫Tcl命令傳來的字串引數, 然後傳回結果字串. 寫C語言程式並不複雜, 而且可以做任何事情,包括訪問資料庫和建立圖形介面. Tcl語言, 並不清楚命令會做什麼 , 它只是進行引數分組, 結果替換和命令分派 .
--------------------------------------------------------------------------------
最後一個例子
這是一個階乘程式:

proc fac {x} {
<wbr> <wbr> if {$x < 0} {
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr>error "Invalid argument $x: must be a positive integer"
<wbr> <wbr> } elseif {$x <= 1} {
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr>return 1
<wbr> <wbr> } else {
<wbr> <wbr> <wbr> <wbr> <wbr> <wbr>return [expr $x * [fac [expr $x-1]]]
<wbr> <wbr> }
}
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9378682/viewspace-1018021/,如需轉載,請註明出處,否則將追究法律責任。

相關文章