TCL指令碼語言基礎介紹

Augusdi發表於2015-10-13


Tcl簡介(一):Tcl 語法

Tcl 語法

Tcl是一種很通用的指令碼語言,它幾乎在所有的平臺上都可以釋執行,其強大的功能和簡單精妙的語法會使你感到由衷的喜悅,這片文章對 Tcl有很好的描述和說明。如果你看起來很吃力,那是因為 Tcl與一般的語言有一些不同之處,剛開始可能有一些不理解,但很快就會掌握的。請堅持一下,我能堅持寫完,你至少也應該堅持讀一遍吧!

Tcl Overview

這篇文章裡包含了幾乎 Tcl 的全部。文章的作者是Tcl的締造者John Ousterhout,對Tcl的詮釋非常清楚。

Introduction 簡介

Tcl 代表 "tool command language" 發音為 "tickle." 。它實際上包含了兩個部分:一個語言和一個庫。

首先,Tcl是一種簡單的指令碼語言,主要使用於釋出命令給一些互交程式如文字編輯器、偵錯程式和shell。它有一個簡單的語法和很強可擴充性,Tcl可以建立新的過程以增強其內建命令的能力。

其次,Tcl是一個庫包,可以被嵌入應用程式,Tcl的庫包含了一個分析器、用於執行內建命令的例程和可以使你擴充(定義新的過程)的庫函式。應用程式可以產生Tcl命令並執行,命令可以由使用者產生,也可以從使用者介面的一個輸入中讀取(按鈕或選單等)。但Tcl庫收到命令後將它分解並執行內建的命令,經常會產生遞迴的呼叫。

應用程式使用Tcl作為它的命令語言有三個好處:
1 Tcl提供了標準語法,一旦使用者掌握了Tcl就可以很容易的釋出命令給基於Tcl的程式。
2 Tcl實現了很多的功能,使你的工作變得很方便。
3 TCl可作為程式間通訊的介面。

Tcl Interpreters 直譯器

在Tcl的資料結構中的核心是Tcl_Interp.一個直譯器包含了一套命令,一組變數和一些用於描述狀態的東西。每一個 Tcl命令是在特定的Tcl_Interp中執行的,基於Tcl的應用程式可以同時擁有幾個Tcl_Interp。Tcl_Interp是一個輕量級的結構,可以快速的新建和刪除。

Tcl Data Types 資料型別

Tcl只支援一種資料結構:字串(string)。所有的命令,命令的所有的引數,命令的結果,所有的變數都是字串。請牢記這一點,所有的東西都是字串。

然而字串的實際解釋是依賴於上下文或命令的。它有三種形式:命令(command), 表示式(expresion)和表(list)。下面會討論細節。

Basic Command Syntax 基本語法

Tcl有類似於shell和lisp的語法,當然也有許多的不同。一條Tcl的命令串包含了一條或多條命令用換行符或分號來隔開,而每一條命令包含了一個域(field)的集合,域使用空白分開的,第一個域是一個命令的名字,其它的是作為引數來傳給它。

例如:
set a 22 //相當於C中的 a=22 a是一個變數這條命令分為三個域:1: set 2: a 3: 22
set使用於設定變數的值的命令,a、20 作為引數來傳給它,a使它要操作的變數名,22是要付給的a值。

Tcl的命令名可以使內建的命令也可以是使用者建的新命令,在應用程式中用函式Tcl_CreateCommand來建立。所有的引數作為字串來傳遞,命令自己會按其所需來解釋的引數的。命令的名字必須被打全,但 Tcl直譯器找不到一同名的命令時會用 unknown命令
來代替。

在很多場合下,unknown 會在庫目錄中搜尋,找到一個的話,會自動生成一個Tcl命令並呼叫它。unknown經常完成縮略的命令名的執行。但最好不要使用。

Comments 註釋

和shell很象,第一個字母是'#'的Tcl字串是註釋。

Grouping arguments with double-quotes 用雙引號來叢集引數用雙引號來叢集引數的目的在於使用有空白的引數。
例如:
set a "this string contains whitespace"
如夠一個引數一雙引號來開始,該引數會一直到下一個雙引號才結束。其中可以有換行符和分號。

子替換是在正式執行該調命令之前由分析器作的

Variable substitution with $ 用美元符進行變數替換說白了就是引用該變數。
如:
set a hello
set b $a // b = "hello" 實際上傳給set命令的引數
//是b,"hello"
set c a // b = "a"

Command substitution with brackets 命令子替換(用方括號)

例如:
set a [set b "hello"]
實現執行 set b "hello" 並用其結果來替換源命令
中的方括號部分,產生一條新命令
set a "hello" //"hello" 為 set b "hello" 的返
 //回值
最終的結果是b="hello" a="hello"

當命令的一個子域以方括號開始以方括號結束,表示要進行一個命令子替換。並執行該子命令,用其結果來替換原命令中的方括號部分。方括號中的部分都被視為Tcl命令。

一個複雜一點的例子:
set a xyz[set b "abc"].[set c "def"]
//return xyzabcdef

Backslash substitution 轉移符替換

轉移符時間不可列印字元或由它數意義的字元插入進來。這一概念與C語言中的一樣。

\b Backspace (0x8).

\f Form feed (0xc).

\n Newline (0xa).

\r Carriage-return (0xd).

\t Tab (0x9).

\v Vertical tab (0xb).

\{ Left brace (`{').

\} Right brace (`}').

\[ Open bracket (`[').

\] Close bracket (`]').

\$ Dollar sign (`$').

\sp Space (` '): does not terminate argument.

\; Semicolon: does not terminate command.

\" Double-quote.

Grouping arguments with braces 用花擴括號來叢集引數

用花擴括號來叢集引數與用雙引號來叢集引數的區別在於:用花擴括號來叢集引數其中的三種上述的子替換不被執行。而且可以巢狀。

例如:
set a {xyz a {b c d}}//set收到倆個引數 a 'xyz a {b
//c d}'

eval {
set a 22
set b 33
}//eval收到一個引數 'set a 22\nset b 33'


Command summary 命令綜述

1.一個命令就是一個字串(string)。

2.命令是用換行符或分號來分隔的。

3.一個命令由許多的域組成。第一個於是命令名,其它的域作為引數來傳遞。

4.域通常是有空白(Tab橫向製表健 Space空格)來分開的。

5.雙引號可以使一個引數包括換行符或分號。三種子替換仍然發生。

6.花括號類似於雙引號,只是不進行三總體換。

7.系統只進行一層子替換,機制替換的結果不會再去做子替換。而且子替換可以在任何一個域進行。

8.如果第一個非控字元是`#', 這一行的所有東西都是註釋。

Expressions 表示式

對字串的一種解釋是表示式。幾個命令將其引數按表示式處理,如:expr、for 和 if,並呼叫Tcl表示式處理器(Tcl_ExprLong,Tcl_ExprBoolean等)來處理它們。其中的運算子與C語言的很相似。

!
邏輯非

* / % + -

<< >>
左移 右移 只能用於整數。

< > <= >= == !=
邏輯比較

& ^ |
位運算 和 異或 或

&& ||
邏輯'和' '或'

x ? y : z
If-then-else 與C的一樣

Tcl 中的邏輯真為1,邏輯假為0。

一些例子:

5 / 4.0
5 / ( [string length "abcd"] + 0.0 )
---------------------- ---
計算字串的長度 轉化為浮點數來計算

"0x03" > "2"
"0y" < "0x12"
都返回 1

set a 1
expr $a+2

expr 1+2
都返回 3

Lists 列表

字串的另一種解釋為列表。一個列表是類似於結果的一個字串包含了用空白分開的很多域。例如 "Al Sue Anne John" 是一個有四個元素的例表,在列表中換行父被視為分隔符。

例如:
b c {d e {f g h}} 是一個有三個元素的列表 b 、c 和 {d e {f g h}}。

Tcl的命令 concat, foreach, lappend, lindex, linsert,list , llength, lrange,lreplace, lsearch, 和 lsort 可以使你對列表操作。

Regular expressions 正規表示式

Tcl 提供了兩個用於正規表示式的命令 regexp 和 regsub。
這裡的正則表導師實際上是擴充套件的正規表示式,與 egrep 相一致。

支援 ^ $ . + ? \> \< () | []

Command results 命令結果

每一條命令有倆個結果:一個退出值和一個字串。退出值標誌著命令是否正確執行,字串給出附加資訊。
有效的返回制定議在`tcl.h', 如下:

TCL_OK
命令正確執行,字串給出了命令的返回值。

TCL_ERROR
表示有一個錯誤發生,字串給出了錯誤的描述。全域性變數 errorInfo 包含了人類可讀的錯誤描述,全域性變數errorCode 機器使用的錯誤資訊。

TCL_RETURN
表示 return 命令被呼叫,當前的命令(通常是一個函式)必須立刻返回,字串包含了返回值。

TCL_BREAK
表示break已經被呼叫,最近的巡環必須立刻返回並跳出。字串應該是空的。

TCL_CONTINUE
表示continue已經被呼叫,最近的巡環必須立刻返回不跳出。字串應該是空的。

Tcl程式設計者一般需要關心退出值。當Tcl直譯器發現錯誤發生後會立刻停止執行。

Procedures 函式

Tcl 允許你通過proc命令來擴充命令(定義新的命令),定義之後可以向其它的內建命令一樣使用。
例如:
proc pf {str} {
puts $str
}

pf "hello world"
這裡有一個初學者不注意的地方,上述的定義一定要寫成那樣子。而不能向下面那樣寫:
proc pf {str}
{
puts $str
}
因為proc實際上也只不過是一條命令,是一換行符或分號來結束的,用叢集引數來傳遞函式體。proc的定義如下:
proc name args tclcommand

Variables: scalars and arrays 變數:標量和向量(即陣列)

向量就是陣列,而標量是沒有下表的變數。
我們用C來類比:
int i; // i 是標量
int j[10]; // j 是向量

變數不需要定義,使用的時候會自動的被建立。Tcl支援兩種
變數:標量和向量
舉個例子來說明吧,
set i 100
set j(0) 10
set k(1,3) 20
i是標量,j是向量。
引用的時候:
$i
$j(0)
$k(1,3)

Tcl簡介(二):Tcl 內建命令

Tcl 內建命令

Built-in commands 內建的命令

Tcl提供了下面描述的內建函式。
... 表示引數不定

append varName value
append varName value value value ...
將那一大堆value附加到varName後面。如果變數不存在,會新
建一個。
例子:
set i "aaa"
append i "bbb" "ccc"
//i = aaabbbccc


array subcommand arrayName
array subcommand arrayName arg ...
這是一組用於向量操作的命令。第二個引數是子命令名。

假設:
set a(1) 1111
set a(2) 2222
set a(three) 3333
一下均以它為例子(tclsh在中執行)。

array names arrayName
返回一個陣列元素名字的列表。
tclsh>array names a
1 2 three

array size arrayName
返回陣列的元素個數。
tclsh>array size a
3

下面是用於遍歷的命令
arrry startsearch arrayName
初始化一次遍歷,返回一個遍歷標示(searchId)在下面的命令
是中使用。

array nextelement arrayName searchId
返回下一個陣列中的元素。如果沒有返回一個空串。

array anymore arrayName searchId
返回 1 表示還有更多的元素。0 表示沒有了。

array donesearch arrayName searchId
結束該次遍歷。

array nextelement arrayName searchId
返回下一個元素。

tclsh>array startsearch a
s-1-a
tclsh>array nextelement a s-1-a
1111
tclsh>array nextelement a s-1-a
2222
tclsh>array anymore a s-1-a
1
tclsh?array nextelement a s-1-a
3333
tclsh>array donesearch a s-1-a

注意可以同時併發多個遍歷。

break
跳出最近的迴圈。

case string in patList body ...
case string patList body ...
case string in {patList body ...}
case string {patList body ...}
分支跳轉。
例如:
case abc in {a b} {puts 1} default {puts 2} a* {puts 3}
return 3.

case a in {
{a b} {format 1}
default {format 2}
a* {format 3}
}
returns 1.

case xyz {
{a b}
{format 1}
default
{format 2}
a*
{format 3}
}
returns 2.
注意default不可以放在第一位。支援shell檔名風格的匹配
符。

catch command
catch command varName
用於阻止由於錯誤而導致中斷執行。執行command, 每次都返
回TCL_OK, 無論是否有錯誤發生。如有錯誤發生返回1 ,反之返回0
。如果給了varName這被置為錯誤資訊。注意varName是已經存在的
變數。

cd
cd dirName
轉換當前工作目錄。如dirName未給出則轉入home目錄。

close fileId
關閉檔案描述符。

concat arg ...
將引數連線產生一個表。
concat a b {c d e} {f {g h}}
return `a b c d e f {g h}'

continue
結束該次迴圈並繼續迴圈。

eof fileId
如fileId以結束 返回1,反之返回 0。

error message
error message info
error message info code
返回一個錯誤,引起直譯器停止執行。info用於初始化全域性變
量errorInfo。code被付給errorCode。

eval arg ...
將所有的引數連起來作為命令語句來執行。

exec arg ...
彷彿是在shell下執行一條命令。
exec ls --color
exec cat /etc/passwd > /tmp/a

exit
exit returnCode
中斷執行。

expr arg
處理表示式。
set a [expr 1+1]
//a=2

file subcommand name
一組用於檔案處理的命令。
file subcommand name arg ...

file atime name
返回檔案的最近存取時間。

file dirname name
返回name所描述的檔名的目錄部分。

file executable name
返回檔案是否可被執行。

file exists name
返回1 表示檔案存在,0 表示檔案不存在。

file extension name
返回檔案的副檔名。

file isdirectory name
判斷是否為目錄。

file isfile name
判斷是否為檔案。

file lstat name varName
以陣列形式返回。執行lstat系統函式。儲存在varName。

file mtime name
檔案的最近修改時間。

file owned name
判斷檔案是否屬於你。

file readable name
判斷檔案是否可讀。

file readlink name
都出符號連線的真正的檔名。

file rootname name
返回不包括最後一個點的字串。

file size name
返回檔案的大小。

file stat name varName
呼叫stat內和呼叫,以陣列形式存在varName中。

file tail name
返回最後一個斜線以後的部分。

file type name
返回檔案型別file, directory, characterSpecial,
blockSpecial, fifo, link, 或
socket。

file writable name
判斷檔案是否可寫。

flush fileId
立即處理由fileId描述的檔案緩衝區。

for start test next body
for迴圈。同C總的一樣。

for {set i 1} {$i < 10} {incr i} {puts $i}

foreach varname list body
類似於C Shell總的foreach或bash中的for..in...

format formatString
format formatString arg ...
格式化輸出,類似於C中的sprintf。
set a [format "%s %d" hello 100]
//a="hello 100"

gets fileId
gets fileId varName
從檔案中讀出一行。
set f [open /etc/passwd r]
gets $f

glob filename ...
glob -nocomplain filename ...
使用C Shell風格的檔名通配規則,對filename進行擴充套件。
ls /tmp
a b c

tclsh>glob /tmp/*
a b c
當加上引數 -nocomplain 時,如檔案列表為空則發生一個錯
誤。

global varname ...
定義全域性變數。

if test trueBody
if test trueBody falseBody
if test then trueBody
if test then trueBody else falseBody
條件判斷,是在沒什麼說的。

incr varName
incr varName increment
如果沒有incremnet,將varName加一,反之將varName加
上increment。

set i 10
incr i
//i=11
incr i 10
//i=21

info subcommand
info subcommand arg ...
取得當前的Tcl直譯器的狀態資訊。

info args procname
返回由procname指定的命令(你自己建立的)的引數列表。
如:
proc ff { a b c } {puts haha}
info args ff
//return "a b c" 

info body procname
返回由procname指定的命令(你自己建立的)的函式體。
如:
proc ff { a b c } {puts haha}
info body ff
//return "puts haha" 

info cmdcount
返回當前的直譯器已經執行的命令的個數。

info commands
info commands pattern
如果不給出模式,返回所有的命令的列表,內建和自建的。
模式是用C Shell匹配風格寫成的。

info complete command
檢查名是否完全,有無錯誤。

info default procname arg varname
procname的引數arg,是否有預設值。

info exists varName
判斷是否存在該變數。

info globals
info globals pattern
返回全域性變數的列表,模式同樣是用C Shell風格寫成的。

info hostname
返回主機名。

info level
info level number
如果不給引數number則返回當前的在棧中的絕對位置,參
見uplevel中的描述。如加了引數number,則返回一個列表包
含了在該level上的命令名和引數。

info library
返回標準的Tcl指令碼的可的路徑。實際上是存在變數
tcl_library中。

info locals
info locals pattern
返回locale列表。

info procs
info procs pattern
返回所有的過程的列表。

info script
返回最裡面的指令碼(用 source 來執行)的檔名。

info tclversion
返回Tcl的版本號。

info vars
info vars pattern
返回當前可見的變數名的列表。

下面是一些用於列表的命令,範圍可以是end。

join list
join list joinString
將列表的內容連成一個字串。

lappend varName value ...
將value加入列表varName中。

lindex list index
將list視為一個列表,返回其中第index個。列表中的第一個
元素下標是0。
lindex "000 111 222" 1
111

linsert list index element ...
在列表中的index前插入element。

list arg ...
將所有的引數發在一起產生一個列表。
list friday [exec ls] [exec cat /etc/passwd]

llength list
返回列表中元素的個數。
set l [list sdfj sdfjhsdf sdkfj]
llength $l
//return 3

lrange list first last
返回列表中從frist到last之間的所有元素。
set l [list 000 111 222 333 444 555]
lrange $l 3 end
//return 333 444 555

lreplace list first last
lreplace list first last element ...
替換列表中的從first到last的元素,用element。
set l [list 000 111 222 333 444 555]
lreplace $l 1 2 dklfj sdfsdf dsfjh jdsf
000 dklfj sdfsdf dsfjh jdsf 333 444 555

lsearch -mode list pattern
在列表中搜尋pattern,成功返回序號,找不到返回-1。
-mode : -exact 精確
-glob shell的萬用字元
-regexp 正規表示式

lsearch "111 222 333 444" 111
//return 0
lsearch "111 222 333 444" uwe
//return 1

lsort -mode list
排列列表。
-mode : -ascii
-dictionary 與acsii類似,只是不區分大小寫
-integer 轉化為整數再比較
-real 轉化為浮點數再比較
-command command 執行command來做比較

open fileName
open fileName access
開啟檔案,返回一個檔案描述符。
access
r w a r+ w+ a+
定義與C中相同。如檔名的第一個字元為|表示一管道的形式
來開啟。
set f [open |more w]
set f [open /etc/pass r]

proc name args body
建立一個新的過程,可以替代任何存在的過程或命令。

proc wf {file str} {
puts -nonewline $file str
flush $file
}

set f [open /tmp/a w]
wf $f "first line\n"
wf $f "second line\n"
在函式末尾可用 return 來返回值。

puts -nonewline fileId string
向fileId中寫入string,如果不加上 -nonewline 則自動產
生一個換行符。

pwd
返回當前目錄。

read fileId
read fileId numBytes
從fileId中讀取numBytes個位元組。

regexp ?switches? exp string ?matchVar? ?subMatchVar
subMatchVar ...?
執行正規表示式的匹配。
?switches? -nocase 不區分大小寫
-indices 返回匹配區間
如:
regexp ^abc abcjsdfh
//return 1
regexp ^abc abcjsdfh a
//return 1
puts $a
//return abc

regexp -indices ^abc abcsdfjkhsdf a
//return 1
puts $a
//return "0 2"


regsub ?switchs? exp string subSpec varName
執行正規表示式的替換,用subSpec的內容替換string中匹配exp
的部分。
?switchs? -all 將所有匹配的部分替換,預設子替換第一
個,返回值為替換的個數。
-nocase 不區分大小寫。
如:
regsub abc abcabcbac eee b
//return 1
puts $b
//return "eeeabcabc"

regsub -all abc abcabcabc eee b
//return 3
puts $b
//return "eeeeeeeee"


return
立即從當前命令中返回。
proc ff {} {
return friday
}

set a [ff]
//a = "friday"

scan string `format' varname ...
從string中安format來讀取值到varname。

seek fileId offset ?origin?
移動檔案指標。
origin: start current end
offset從哪裡開始算起。

set varname ?value?
設定varname用value,或返回varname的值。如果不是在一
個proc命令中則生成一個全域性變數。

source fileName
從filename中讀出內容傳給Tcl解釋起來執行。

split string ?splitChars?
將string分裂成列表。預設以空白為分隔符,也可通
過splitChars來設定分隔符

string subcommand arg ...
用於字串的命令。

string compare string1 string2
執行字串的比較,按 C strcmp 的方式。返回 -1, 0, or 1。

string first string1 string2
在string1種查詢string2的定義次出現的位置。未找到返回-1。

string length string
返回字串string的長度。

string match pattern string
判斷string是否能匹配pattern。pattern是以shell檔名的
統配格式來給出。

string range string first last
返回字串string中從first到last之間的內容。

string tolower string
將string轉換為小寫。

string toupper string
將string轉換為大寫。

string trim string
將string的左右空白去掉。

string trimleft string
將string的左空白去掉。

string trimright string
將string的右空白去掉。

tell fileId
返回fileId的檔案指標位置。

time command
執行命令,並計算所消耗的時間。
time "ls --color"
some file name
503 microseconds per iteration

trace subcommand
trace subcommand arg ...
監視變數的儲存。子命令定義了不少,但目前只實現了
virable。
trace variable name ops command
name 為變數的名字。
ops 為要監視的操作。
r 讀
w 寫
u unset
command 條件滿足時執行的命令。
以三個引數來執行 name1 name2 ops
name1時變數的名字。當name1為向量時,name2為下標,ops
為執行的操作。

例如:
proc ff {name1 name2 op} {
puts [format "%s %s %s" name1 name2 op]
}
set a hhh
trace variable a r {ff}
puts $a
//return "a r\nhhh"

unknown cmdName
unknown 並不是 Tcl 的一部分,當 Tcl 發現一條不認識的命
令時會看看是否存在 unknown命令,如果有,則呼叫它,沒有則出
錯。

如:
#!/usr/bin/tclsh
proc unknown {cwd args} {
puts $cwd
puts $args
}
//下面是一條錯誤命令
sdfdf sdf sdkhf sdjkfhkasdf jksdhfk
//return "sdfdf sdf sdkhf sdjkfhkasdf jksdhfk"

unset name ...
刪除一個或多個變數(標量或向量)。

uplevel command ...
將起引數連線起來(象是在concat中)。最後在由level所指
定的上下文中來執行。如果level是一個整數,給出了在棧中的距
離(是跳到其它的命令環境中來執行)。
預設為1(即上一層)。
如:
#!/usr/bin/tcl
proc ff {} {
set a "ff" //設定了區域性的a
-------------------------
}
set a "global"
ff
puts $a
//return "global"

再看下一個:
#!/usr/bin/tcl
proc ff {} {
uplevel set a "ff" //改變上一級棧中的a
-------------------------------------
}
set a global
ff
puts $a
//return "ff"
如果level是以#開頭後接一個整數,則level指出了在棧中的
絕對位置。如#0表示了頂層(top-level)。
a b c 分別為三個命令,下面是它們之間的呼叫關係,
top-level -> a -> b -> c -> uplevel level
絕對位置: 0 1 2 3
當level為 1 或 #2 都是在 b 的環境中來執行。
3 或 #0 都是在 top-level 的環境中來執行。

upvar ?level? otherVar myVar ?otherVar myVar ...?
在不同的棧中為變數建立連線。這裡的level與uplevel中
的level是同樣風格的。
例如:
#!/usr/bin/tcl
proc ff {name } {
upvar $name x
set x "ff"
}
set a "global"
ff a
puts $a
//return "ff"

while test body
舉個例子吧:
set x 0
while {$x<10} {
puts "x is $x"
incr x
}

Built-in variables 內建的變數
下名的全域性變數是由 Tcl library 自動來管理的。一般是隻
讀的。

env
環境變數陣列。
如:
puts $env(PATH)
// return /bin:/usr/bin:/usr/X11R6/bin

errorCode
當錯誤發生時儲存了一些錯誤資訊。用下列格式來儲存:
CHILDKILLED pid sigName msg
當由於一個訊號而被終止時的資訊。
CHILDSTATUS pid code
當一個子程式以非0值退出時的格式。
CHILDSUSP pid sigName msg
當一個子程式由於一個訊號而被終止時的格式。
NONE
錯誤沒有附加資訊。
UNIX errName msg
當一個核心呼叫發生錯誤時使用的格式。

errorInfo
包含了一行或多行的資訊,描述了錯誤發生處的程式和資訊。

原文的作者也是Tcl的締造者 John Ousterhout

Tcl簡介(三):Tcl 內建命令

Tcl 名字空間

namespace
建立和操縱命令和變數的上下文(content)。

簡介:
一個名字空間是一個命令和變數的集合,通過名字空間的封裝來
保證他們不會影響其它名字空間的變數和命令。 Tcl 總是維護了一
個全域性名字空間 global namespace 包含了所有的全域性變數和命令。

namespace eval允許你建立一個新的namespace。
例如:
namespace eval Counter {
namespace export Bump
variable num 0

proc Bump {} {
variable num//宣告區域性變數
incr num
}
}
名字空間是動態的,可變的。
例如:
namespace eval Counter {
variable num 0//初始化
proc Bump {} {
variable num
return [incr num]
}
}

//新增了一個過程
namespace eval Counter {
proc test {args} {
return $args
}
}

//刪除test
namespace eval Counter {
rename test ""
}
引用:
set Counter::num
//return 0
也可以用下面的方式新增:
proc Foo::Test {args} {return $args}
或在名字空間中移動:
rename Foo::Test Bar::Test

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/danforn/archive/2007/06/25/1665930.aspx

相關文章