Tcl 語法
ArticleCategory: [Artikel Kategorie]
Software Development
AuthorImage:[Bild des Autors]
TranslationInfo:[Author and translation history]
original in en Brent B. Welch
en to cnKevin Hsu
AboutTheAuthor:[Über den Autor]
Brent Welch 目前正有興趣於建立一個 www.scriptics.com
網站, 包括一個收集Tcl有關
的 URLs ( Tcl資源中心) 並加上註解的資料庫和一個TclPro Product的電子商務建設
(ecommerce infrastructure) 。他也在開發幾個大型的 Tcl/Tk應用程式,包括有在
www.scriptics.com
網站上執行的Tcl Httpd web 伺服器、Exmh 郵件使用者介面和
webtk HTML 編輯器。他是 " Tcl 和 Tk 程式設計實務 (Practical Programming in
Tcl and Tk)" 一書的作者。Welch 於1982年在科羅拉多州Boulder大學航空工程系獲得
學士學位, 1986年在加州Berkeley大學取得資訊工程碩士學位, 1990年在加州Berkeley
大學取得資訊工程博士學位。Welch先前是 Xerox公司 PARC研究中心研究員之一成員,
研究分散式系統 (distributed systems)。然後他加入 Sun Microsystems 實驗室之
Tcl/Tk小組成員。他也是美國電腦協會(ACM)和國際電子工程師協會 (IEEE) 的會員。
首頁位址:http://www.beedub.com/
Abstract:[Zusammenfassung]
這篇文章介紹了Tcl語言的基本觀念和語法。
ArticleIllustration:[Titelbild des Artikels]
ArticleBody:[Der eigentliche Artikel]
Tcl語法簡介
以一種腳本語言來說, Tcl具有簡單的語法。
cmd arg arg arg
- 一個Tcl命令是由空白分隔的關鍵字所組成。其中, 第一個字是命令名稱, 其餘的是命
令參數 .
$foo
- 錢符號 ($) 取代了變數的值。在本例中, 變數名稱是
foo
.
[clock seconds]
- 方括號執行了一個巢狀命令 (nested command)。例如, 如果你想傳遞一個命令的結果作?另外一個命令的參數, 那麼你必須使用這種語法。在這個例子中, 巢狀命令是 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 parser 剖析Tcl語法必須使用以下三個步驟: 將參數分成群組, 結果替代和命令指派
- 將參數分成群組. Tcl需要決定如何組織命令的參數。在最簡單的情況中, 直接利用空白分隔參數。先前提到過, 引號和括弧語法可讓多個關鍵字組成一個參數。在前個例子中, 雙引號用來組成
puts
命令的一個參數。
- 結果替代. 在參數分成群組後, Tcl執行字串替代。Put命令中, 只是簡單用變數
$foo
的值替代了 foo
, 用結果替代了括弧命令。替代是在分組之後進行的。這種次序使特別的值並未使命令結構變複雜.
- 命令指派. 在結果替代後, Tcl 使用命令名稱當做鍵值來搜尋指派表 (Dispatch Table) , 它呼叫表中相對應的 C 程序, 然後此 C 程序是用來執行命令的。你也可使用 Tcl 來撰寫命令程序。而此種程序在參數傳遞與錯誤處理中有一些簡單的規定。
另一個例子
下面是另一個例子:
set i 0
while {$i < 10} {
puts "$i squared = [expr $i*$i]"
incr i
}
在此處, 大括弧用來將參數分組, 且並沒有做任何替代。 Tcl parser 了解
while
命令並沒有特別的地方, 就像對待其它的一般命令一樣。 while
命令利用 Tcl Parser 執行, 可知道第一個參數是運算式, 而第二個參數則是多個 Tcl 命令。 大括弧將它分成兩個參數:邏輯運算式與控制迴圈, Tcl 命令在迴圈部分。
我們看到了兩個數學運算式: 布林代數比較和乘法運算。while 命令自動將一個參數值當作運算式來計算。在其他的情況下, 您要明確使用
expr
命令來執行數學運算
命令指派
最後, Tcl 呼叫其它程序來處理困難的工作。我們已經可看到 Tcl 使用 expr
命令來執行數學函數, puts
命令來處理輸出功能, set
命令來設定值給變數。這些 Tcl 命令是透過本身已在 Tcl 中登錄過 (Registered) 的 C 語言程序來執行的。C 語言的命令程序由 Tcl 命令取得字串參數, 然後傳回一個結果為一個新的字串。想要撰寫 C 語言命令程序很簡單。它可以做任何事情, 包括存取資料庫和建立圖形使用者介面。Tcl語言, 並不知道命令會有什麼樣的功用 , 它只是利用參數分群組, 結果替代和命令指派三步驟來執行命令。
最後一個例子
這裡是一個階乘程序:
proc fac {x} {
if {$x < 0} {
error "Invalid argument $x: must be a positive integer"
} elseif {$x <= 1} {
return 1
} else {
return [expr $x * [fac [expr $x-1]]]
}
}
更進一步的閱讀
本文出處: Scriptics
中文翻譯: 徐子淵 (Kevin Hsu)