TCL編程高級教程_第1頁
TCL編程高級教程_第2頁
TCL編程高級教程_第3頁
TCL編程高級教程_第4頁
TCL編程高級教程_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、TCL編程高級教程測試平臺開發(fā)部 周健明 04245培訓內容 命名空間 腳本庫和程序包 ITCL命名空間 命名空間的基本概念命名空間概念定義命名空間示例限定命名名稱解析輸入命令輸出命令命名空間的命令參考命名空間 命名空間的基本概念 命名空間是一個命令與變量的集合。命名空間把命令和變量封裝起來以確保它們不會干擾別的命名空間中的命令和變量。 TCL已經(jīng)有一個這樣的集合,就是我們指的全局命名空間全局命名空間。全局命名空間將所有的全局變量和命令放在一起。 命名空間也叫做名稱空間、名稱域、命名域 等。命名空間 命名空間創(chuàng)建: 用 namespace eval 命令創(chuàng)建一個新的命名空間 命名空間查詢 如果

2、要在命名空間XXX之外查詢命名空間內部變量的值xxx,可以用如下語句: set : XXX:xxx 命名空間 命名空間示例1:用 namespace eval 命令創(chuàng)建一個新的命名空間: namespace eval Counter namespace export bump variable num 0 proc bump variable num incr num set :Counter:num :Counter:bump 命名空間 命名空間示例2:命名空間是動態(tài)的。你可以在任何時候添加、刪除命令和變量 : namespace eval Counter variable num 0 pr

3、oc bump variable num return incr num 命名空間 命名空間示例2:命名空間是動態(tài)的。你可以在任何時候添加、刪除命令和變量 : namespace eval Counter proc test args return $args namespace eval Counter rename test test過程先被加到Counter命名空間中,稍后又被rename命令移除了 命名空間 命名空間示例3:命名空間里面可以擁有其它的命名空間形成一個嵌套的分層目錄結構。 namespace eval Foo variable fooVar 0 . namespace e

4、val Counter namespace export bump variable num 0 proc bump variable num incr num 命名空間 命名空間示例3:現(xiàn)在如果在Foo之外訪問num就要把Foo也加入到限定命名中: set :Foo:Counter:num 而在Foo內部訪問num就只需要用: set Counter:num set :Foo:Counter:num 命名空間 限定命名 限定命名又叫限定名稱、資格命名或資格名稱,英文原名為qualified names 每一個命名空間有一個原始的名稱諸如histroy或:safe:interp。由于命名空間可

5、能嵌套,限定命名被用來表示命令、變量、子命名空間。限定命名跟Unix的路徑或TK部件(widgets)的分層目錄結構類似,只是命名空間的限定命名使用:作為分隔符而不是 / 或 . 而已。 最頂層或全局的命名空間的名稱是空(如:空字符串),在形式上與 : 同義。 如果你想訪問另一個命名空間中的命令和變量,你必須使用額外的語法結構,使用命名空間的限定命名。 命名空間 限定命名 除了全局命名空間外,命名空間的命名都不為空。除了作為命名空間的分隔符外,:也不被簡單的命令、變量、命名空間命名接受。在限定命名尾部的:表示該命名空間變量或命令的命名是,因此在限定命名空間名稱尾部的 : 會被忽略。另外,在限定

6、命名中單個的 : 將被看作單個的字符,而2個或更多的單個 : 將被當作一個命名空間分隔符看待。例如: namespace eval :aa:bb:cc set x 100 ;#定義命名空間:aa:bb:cc中的變量x set :aa:bb:cc:x ;#查詢x的值,將返回100 set :aa:bb:cc:x ;#也返回100,b與c之間的3個:,c與x之間的4個:都被當作一個:看待 set :aa:bb:c:x ;#將出錯,因為b與c之間的1個:被當作普通的字符看待,但并沒有定義 :a:bb這樣的命名空間,所以要小心!:aa:bb表示的是命名空間aa下的命名空間bb ,而:aa:bb表示的是

7、命名空間aa:bb 。 命名空間 名稱解析 一般來說,所有的TCL命令都支持變量和命令的限定命名。也就是說你可以在 set 、proc、rename、interp alias 等命令中使用限定命名。如果你提供以:開頭的完整限定命名,則可以精確地找到你指的命令、變量或命名空間。命名空間 名稱解析 如果命名不是以 : 開頭的,則意味著相對路徑的命名,TCL提供如下的名稱解析策略:首先在當前命名空間中查找,如果沒有才在全局命名空間查找。 如果在當前命名空間和全局命名空間都沒找到,則該命名尚未定義。 例1: set traceLevel 0 namespace eval Debug printTrac

8、e $traceLevel TCL首先在命名空間Debug中查找traceLevel,然后是全局命名空間。命名空間 名稱解析 例2: set traceLevel 0 namespace eval Foo variable traceLevel 3 namespace eval Debug printTrace $traceLevel TCL首先在命名空間 Foo:Debug 中查找 traceLevel ,因為沒找到,所以就到全局命名空間中查找。在命名空間Foo中定義的變量 Foo:traceLevel 既不是當前命名空間Foo:Debug中的變量,也不是全局命名空間中的變量,因此在名稱解析

9、的過程中被完全忽略了。 命名空間 輸入命令和輸出命令 命名空間常常用來描述庫,需要頻繁使用命名空間前綴,用輸入命令和輸出命令可以省略命令前面的命名空間前綴。 輸入命令: namespace import 輸出命令: namespace export命名空間 輸入命令 namespace import 命令只輸入命名空間中用namespace export命令輸出的命令 如果不再需要使用已經(jīng)輸入的命令,可以使用namespace forget 示例: namespace import Blt:graph Blt:table 就只輸入graph和table命令到當前上下文中。 用namespace

10、 forget命令來移除: namespace forget Blt:* 。 當你在輸出命名空間中刪除一個命令時(如:rename Blt:graph ),該命令也自動從所有輸入它的命名空間中移除。 命名空間 輸出命令 在命令空間中輸出命令,用namespace export命令聲明要輸出的命令: namespace export xxx namespace export 命令指明了哪些命令可以被其他命名空間輸入。namespace import 命令只輸入那些在命名空間中明確定義為輸出的命令。如果namespace import命令指定了一個沒有輸出的命令,該命令不會被輸入 。 命名空間 命

11、名空間的命令參考: namespace命令 :命令與變量的上下文創(chuàng)建和維護是通過namespace命令來進行的 命名空間的創(chuàng)建和刪除 命名空間的環(huán)境抓取和腳本執(zhí)行 命名空間的輸入和輸出 命名空間信息查詢 限定命名操作命名空間 命名空間的其他相關命令: variable命令 :variable命令用于創(chuàng)建和初始化一個命名空間的變量 glob-style (glob樣式) :glob本身是使用通配符查找符合特定pattern的文件名的命令,而glob-style(樣式)的就是指使用與glob語法相同的通配符進行模糊查找的匹配方式。 培訓內容 命名空間 腳本庫和程序包 ITCL腳本庫和程序包 腳本庫

12、 什么是腳本庫創(chuàng)建和調用腳本庫 腳本庫的優(yōu)缺點 程序包 什么是程序包創(chuàng)建程序包索引文件pkgIndex.tcl 使用程序包 與腳本庫和程序包相關的全局變量和過程 腳本庫和程序包 腳本庫 Q:什么是腳本庫?A:TCL中提供了Library來存放一些有用的TCL過程的集合,就是腳本庫。 使用腳本庫的好處是應用程序可以由一個較短的主程序、一個或多個支持庫組成,這樣應用程序加載時只加載主程序,而支持庫中的過程會在使用時才加載,可以縮短整個應用程序的加載時間。 腳本庫的另一個好處是可以供多個應用程序使用,這樣也可以提高程序的共享和復用。 另外,腳本庫還提供自動加載機制。腳本庫和程序包 創(chuàng)建腳本庫:STE

13、P:創(chuàng)建腳本庫只需以下兩步: 第一,創(chuàng)建腳本文件。 第二步,為自動加載創(chuàng)建索引文件。 在TCL解釋器(如tclsh或wish)中,執(zhí)行命令: auto_mkindex . 腳本庫和程序包 調用腳本庫: 在腳本庫及其tclIndex文件被創(chuàng)建后,只需要把腳本庫的路徑添加到TCL的全局變量 auto_path 中即可,以后就可以自由引用腳本庫中的過程。 TCL會自動搜索 auto_path 每個路徑下的 tclIndex 文件來確定要調用的過程在哪里。 一般使用 lappend 命令將路徑添加到 auto_path 中, 例如: % lappend auto_path c:/tcllib/lib1

14、 C:/DEVELOP/TCL/lib/tcl8.3 C:/DEVELOP/TCL/lib C:/DEVELOP/TCL/lib/tk8.3 c:/tcllib/lib1 如果一個函數(shù)在幾個腳本庫中都有定義的話,TCL會按照搜索順序自動加載在 auto_path 中位置靠前的那個庫。因此,如果加載的腳本庫要先被搜索的話,可以使用 linsert 命令將其插入到 auto_path 中靠前的位置中, 例如: % set auto_path linsert $auto_path 0 c:/tcllib/lib1 c:/tcllib/lib1 C:/DEVELOP/TCL/lib/tcl8.3 C:

15、/DEVELOP/TCL/lib C:/DEVELOP/TCL/lib/tk8.3 腳本庫和程序包 腳本庫的優(yōu)缺點優(yōu)點:腳本庫的方法從TCL 的最早版本開始就支持,不存在兼容性問題,很多現(xiàn)有的公共腳本就是使用腳本庫創(chuàng)建的。由于通過把路徑添加到 auto_path 變量中來實現(xiàn)對腳本庫的定位,因此腳本庫可以存放在任何位置,沒有路徑限制。 缺點:不支持版本號,不便于腳本庫的更新和維護。由于腳本庫只能用TCL語言編寫,能夠實現(xiàn)的功能有限。另外,每個腳本庫的路徑都要添加到 auto_path 變量中也比較煩瑣。 為解決上述問題和進一步提高TCL 的擴展能力,較新版本的TCL提供了更好的程序包機制。 腳

16、本庫和程序包 程序包Q:什么是程序包?A:由于腳本庫的局限性,TCL提供了更好的 package 機制來實現(xiàn)對TCL的共用和擴展,也就是程序包 。 腳本庫和程序包 創(chuàng)建TCL程序包: 把你想包含在某個包中的所有自定義過程放到一個TCL腳本文件中,然后在文件的開頭使用 package provide 命令指明這個包的名字和版本即可。 腳本庫和程序包 創(chuàng)建二進制程序包 : 用TCL編寫的程序包,功能仍然有限,因此TCL還特別支持二進制程序包。這樣,就可以用C/C+語言編寫TCL擴展命令了,充分利用Windows或UNIX系統(tǒng)提供的強大 API 功能。 二進制程序包實際上就是由系統(tǒng)平臺所支持的編譯后

17、的可執(zhí)行代碼共享庫。根據(jù)當前系統(tǒng)平臺的不同,二進制程序包的文件后綴也不一樣。在 UNIX 上二進制程序包的后綴是 .so ,在 Macintosh 上是 .shlib ,而在 Windows 上就是我們所熟悉的動態(tài)連接庫 .dll 。 腳本庫和程序包 索引文件 pkgIndex.tcl生成索引文件 pkgIndex.tcl 自動生成 pkgIndex.tcl 文件的命令: pkg_mkIndex 。 pkg_mkIndex -lazy -load -verbose . 腳本庫和程序包 如何使用程序包如何使用程序包: 使用某一個程序包時,可以調用 package require 命令,該命令對T

18、CL和二進制的程序包都適用。 命令格式: package require -exact 參數(shù) name 是程序包的名字,也就是在 TCL中用 package provide 命令、在 DLL 中用 Tcl_PkgProvide 函數(shù)指定的名稱。 參數(shù) version 是版本號,格式為 major.minor ,其中major 是主版本號,minor是次版本號,兩者用小數(shù)點隔開。 如果省略version ,則加載當前能找到了名稱叫 name 的程序包中版本最高的那一個,否則加載相同 major 版本的最高 minor 版本;如果使用 -exact 選項。 在書寫名稱時要注意與程序包中的聲明一致,

19、尤其是字母大小寫。 腳本庫和程序包 與腳本庫和程序包相關的全局變量和過程與腳本庫和程序包相關的全局變量和過程 auto_path變量 :保存Tcl 腳本庫/程序包的搜索路徑 。 tcl_library變量 :存放著默認的庫目錄 。 auto_index數(shù)組:auto_index是一個TCL數(shù)組(array),指明哪個命令在哪個tcl腳本里的對應關系 。 tclPkgUnknown過程:對于auto_index里沒有指明的命令,TCL會調用tclPkgUnknown過程來查找 。 unknown過程:對于auto_index里沒有指明的命令,TCL會調用tclPkgUnknown過程來查找 。

20、init.tcl 文件:Tcl控制臺外殼利用init.tcl初始化它自身 。 培訓內容 命名空間 腳本庫和程序包 ITCLITCL ITCL簡介 類和對象變量和方法接口和實現(xiàn)的分離public、protected、private通用變量和過程重用:繼承重用:合成類的固有(build-in)方法 ITCL和C擴展ITCL ITCL簡介ITCL是INCR TCL的縮寫,也稱TCL+,是TCL的一個重要擴展,并和TCL完全兼容。ITCL支持面向對象的程序設計。 面向對象的編程可以提高軟件重用的程度和效率,改善程序結構,這也是我們引入ITCL的原因。ITCL 類和對象變量和方法在ITCL中,使用cla

21、ss命令可以定義一個新類,類里面可以定義變量和方法,這里的變量和方法對應于C+中類的成員變量和成員函數(shù)。定義變量使用variable命令,這和名字空間中一樣。定義方法使用method命令。ITCL實例一:ITCL中定義的一個類MyRand,其中的黑體字是關鍵字。class MyRand variable seed clock secondsvariable min 0variable max 100constructor low high puts The constructor of MyRand is called ,create object $thisset min $lowset m

22、ax $highdestructor puts The destructor of MyRand is called ,delete object $thismethod srand set seed clock secondsITCLmethod rand srand return expr $min+$seed%($max-$min)method setrange min max set min $minset max $maxmethod getrange options switch - $options -min return $min -max return $max error

23、bad option$optionsITCL 類和對象變量和方法constructor和destructor命令用于生成類的構造函數(shù)和析構函數(shù),和C+一樣,構造函數(shù)在生成對象時自動調用,析構函數(shù)在銷毀對象時自動調用,和C+一樣,ITCL的類的構造函數(shù)和析構函數(shù)是可以缺省的。ITCL 類和對象接口和實現(xiàn)的分離在ITCL中,方法的聲明和方法的實現(xiàn)是可以分離的,方法體不必寫在ITCL的類的聲明中使用body命令可以在類的外部定義方法體,因為是在類的定義的外部,所以需要使用限定名,由于構造函數(shù)和析構函數(shù)的定義和別的方法不一樣,它們的函數(shù)體必須在類的定義中,不過你可以在類的定義中定義一個空體,然后利用b

24、ody命令在外面重新定義函數(shù)體。類的聲明和實現(xiàn)分離,有助于實現(xiàn)交互式開發(fā)ITCL實例二:class MyRand variable seed clock secondsvariable min 0variable max 100constructor low high puts The constructor of MyRand is called ,create object $thisset min $lowset max $highdestructor puts The destructor of MyRand is called ,delete object $thismethod s

25、rand method rand method setrange min max method getrange options ITCL實例二:body MyRand:srand set seed clock secondsbody MyRand:rand srand return expr $min+$seed%($max-$min)body MyRand:setrange min max set min $minset max $maxbody MyRand:getrange options switch - $options -min return $min -max return $

26、max error bad option$optionsITCL 類和對象public、protected、privatepublic類型的變量和方法可以在類的外部被訪問,并且可以被子類繼承;private和protected類型的變量和方法則只能在類內部被訪問,protected類型的變量和方法與private類型的變量和方法的區(qū)別在于:前者可以被子類繼承,后者則不能。缺省情況下,類中的變量為private,方法為publicITCL中的每個類都有兩個build-in方法:configure和cget,configure方法用來設置對象的屬性,而cget則用來獲取對象的屬性。ITCL 類和對

27、象通用變量和過程在C+中,有一類成員變量,它不屬于任何一個特定對象,但是卻被類的所有對象共享,這種變量被稱為靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員。在ITCL中,也提供類似的變量,不過被稱為通用變量(common variable)。在C+中,有一類成員函數(shù)屬于整個類,可以脫離類的實例而存在,被稱為靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)。ITCL中提供了類似的功能,不過被稱為過程(procedure),可以用proc命令來聲明,一個過程屬于整個類,它可以在生成類的實例之前使用。ITCL實例三:class MyRand private variable seed clock secondspublic variable m

28、in 0public variable max 100private common counter constructor args puts The constructor of MyRand is called ,create object $thisif !info exists counter set counter 0eval configure $argsincr counterdestructor puts The destructor of MyRand is called ,delete object $thisincr counter -1private method sr

29、and public method rand proc getcounter ITCL實例三:body MyRand:srand set seed clock secondsbody MyRand:rand srand return expr $min+$seed%($max-$min)body MyRand:getcounter return $counter對于通用變量和過程,可以直接使用限定名或完全限定名引用:% set MyRand:counter 00% MyRand:getcounter0ITCL 類和對象重用:繼承單重繼承: public和protected類型的變量和方法可以被子類繼承;private類型的變量和方法則不能被子類繼承,父類中方法可以在子類中進行重載。多重繼承: ITCL也提供多重繼承的機制 每個類只能有一個inherit語句,不過可以聲明多個基類。注意基類必須按重要程度的先后排列,因為如果兩個基類具有相同名字的方法的話,在inherit中排在前面的類的方法將被優(yōu)先繼承。ITCL繼承只需要在派生類中用inh

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論