▲英語言過程
至此我們已經(jīng)可以寫一個(gè)簡單的文件格式了:
d_rect 10 10 150 50 2 blue
d_rect 7 7 153 53 2 blue
d_text 80 30 "Simple Drawing Tool" c red我們還有一個(gè)很簡單的分析程序,就是兩個(gè)分析過程和source命令.現(xiàn)在,我們看一下如何來進(jìn)一步改進(jìn).
當(dāng)你觀察大量此類數(shù)據(jù)時(shí),極易被數(shù)據(jù)搞糊涂.第一行包含10 10 110 50 3,你得有些這方面的經(jīng)驗(yàn)才能很快明白前兩個(gè)代表一個(gè)坐標(biāo),后兩個(gè)是另一個(gè)坐標(biāo),最后一個(gè)是線寬.我們能用在數(shù)據(jù)中引入附加文本的方法來使一個(gè)程序員在閱讀時(shí)較為容易.
example3/datafile.dat
d_rect from 10 10 to 150 50 thick 2 clr blue
d_rect from 7 7 to 153 53 thick 2 clr blue
d_text at 80 30 "Simple Drawing Tool" anchor c clr red介詞to和from,參數(shù)名thick和color使數(shù)據(jù)看上去更象英語句子了,為適應(yīng)這些介詞,我們的分析過程需要其他的附加參數(shù):
example3/parser.tcl
proc d_rect {from x1 y1 to x2 y2 thick thickness clr color} {
.c create rectangle $x1 $y1 $x2 $y2 -width $thickness -outline $color
}正如你所看到的,執(zhí)行過程并未改變.新參數(shù)在過程體中并未使用;其目的僅僅是為了使用數(shù)據(jù)可讀性更強(qiáng).
▲選項(xiàng)/數(shù)值對(duì)
Tk工具包提供了一個(gè)創(chuàng)建圖形界面部件的集合.這些部件以選項(xiàng)和他們的值來加以配置,配置的語法很簡單(一個(gè)橫線,后跟選項(xiàng)名,再后面是其值)而且標(biāo)準(zhǔn)化(許多其他的TCL擴(kuò)展集使用相同的語法來配置其部件).
使用選項(xiàng)/數(shù)值對(duì)后,數(shù)據(jù)文件看上去象這樣:
example4/datafile.dat
d_rect -x1 10 -y1 10 -x2 150 -y2 50 -thickness 2
d_rect -thickness 2 -x1 7 -y1 7 -x2 153 -y2 53
d_text -x 80 -y 30 -text "Simple Drawing Tool" -anchor c -color red為分析數(shù)據(jù),我們需要在分析過程d_rect和d_text中引入選項(xiàng)/數(shù)值對(duì),我們首先試一下使用與英語過程相似的啞變量.
proc d_rect {opt1 x1 opt2 y1 opt3 x2 opt4 y2 opt5 thickness opt6 color} {
.c create rectangle $x1 $y1 $x2 $y2 -width $thickness -outline $color
}我們?cè)僖淮慰吹?實(shí)現(xiàn)的過程并未改變.盡管這個(gè)解決方案只對(duì)最簡單的數(shù)據(jù)格式有效,但它很清晰明了.它的優(yōu)點(diǎn)有兩個(gè):選項(xiàng)在參數(shù)列表中的位置是固定的.比如,你不能把color(顏色屬性)放在thickness(線寬屬性)前面.對(duì)一個(gè)純數(shù)據(jù)文件格式來說這個(gè)方法還不錯(cuò)(因?yàn)閿?shù)值往往按相同的順序存儲(chǔ)),但當(dāng)你想將其用于腳本中的手工輸入數(shù)據(jù)時(shí),這個(gè)方法則成了一個(gè)障礙.
選項(xiàng)沒有默認(rèn)值:你必須提供所有選項(xiàng)的值,而不能遺漏其中任何一個(gè).
下面是一個(gè)可解決所有問題的實(shí)現(xiàn)過程.
example4/parser.tcl
proc d_rect {args} {
# First, specify some defaults
set a(-thickness) 1
set a(-color) blue# Then, "parse" the user-supplied options and values
array set a $args# Create the rectangle
.c create rectangle $a(-x1) $a(-y1) $a(-x2) $a(-y2)
-width $a(-thickness) -outline $a(-color)
}與使用一個(gè)長長的參數(shù)表不同,分析過程現(xiàn)在僅有一個(gè)名為args的參數(shù),由它來收集調(diào)用過程時(shí)所有的實(shí)際參數(shù).參數(shù)x1,y1等消失了.他們現(xiàn)在由一個(gè)局部的數(shù)組來處理,稍后我們將圓心解釋.
代碼的第一部分為選項(xiàng)設(shè)定默認(rèn)值,第二部分分析args中的選項(xiàng)/數(shù)值對(duì).TCL內(nèi)建的數(shù)組處理模塊對(duì)此做得非常得心映手.它先在數(shù)組a中創(chuàng)建新的入口,使用選項(xiàng)名(包括前導(dǎo)橫線"-")作為索引,選項(xiàng)值作為數(shù)組值.
如果用戶在調(diào)用中不指定-color選項(xiàng),a(-color)的入口默認(rèn)值保持不變. 除用數(shù)組入口代替過程參數(shù)外,過程體中的最后一行與前面的實(shí)現(xiàn)一樣.
如果用戶調(diào)用時(shí)忘記指定選項(xiàng)-x1,則-x1的數(shù)組入口不會(huì)被設(shè)置(沒有其默認(rèn)值),創(chuàng)建矩形的調(diào)用就會(huì)引發(fā)一個(gè)錯(cuò)誤.此例說明你可以給其中一些選項(xiàng)指定默認(rèn)值,使其可隨意選擇,而另一些則不指定默認(rèn)值,強(qiáng)制其必須由用戶指定.
▲最好的格式通常是各種方法的結(jié)合
推薦閱讀
- 我TCL6198
- 王者清理游戲數(shù)據(jù)后果
- 我的 TCL768 一周使用經(jīng)歷
- FreeBSD 數(shù)據(jù)遷移方法
- MIUI11怎么備份數(shù)據(jù)
- 內(nèi)交外換 明基P30數(shù)據(jù)交換能力初探
- 金融信用信息基礎(chǔ)數(shù)據(jù)庫是征信嗎
- 10 FreeBSD連載:系統(tǒng)啟動(dòng)腳本
- 安裝鴻蒙系統(tǒng)數(shù)據(jù)會(huì)丟失嗎
- 關(guān)于W219的數(shù)據(jù)傳輸
