通過“猜數(shù)字”游戲?qū)W習(xí) Tcl
我的 Tcl 之旅始于最近需要將一個困難的基于 Java 的命令行配置工具自動化。我使用 Ansible 做了一些自動化編程,偶爾也會使用 ??expect?
?? 模塊。坦率地說,我發(fā)現(xiàn)這個模塊的作用有限,原因包括:難以對相同的提示進行排序,難以捕捉到額外步驟的值,控制邏輯的靈活性有限,等等。有時你可以用 ??shell?
? 模塊來代替。但有時你會遇到那種特立獨行、過于復(fù)雜的命令行程序,似乎無法實現(xiàn)自動化。
就我而言,我正在自動安裝我公司的一個程序。最后的配置步驟只能通過命令行來完成,通過幾個不規(guī)范的、重復(fù)的提示和需要捕捉的數(shù)據(jù)輸出。好在傳統(tǒng)的 Expect 是唯一的答案。要使用 Expect 的基本功能,并不需要對 Tcl 有很深的了解,但你了解的越多,你就能從它那里得到更多的力量。這是后續(xù)文章的話題?,F(xiàn)在,我探討一下 Tcl 的基本語言結(jié)構(gòu),包括用戶輸入、輸出、變量、條件判斷、循環(huán)和簡單函數(shù)。
安裝 Tcl
在 Linux 系統(tǒng)上,我使用這個:
在 macOS 上,你可以使用 ??Homebrew?? 來安裝最新的 Tcl:
在 Tcl 中猜數(shù)字
從創(chuàng)建基本的可執(zhí)行腳本 ??numgame.tcl?
? 開始:
接著在你的文件中開始編碼,標題是通常的 #!:
這里有一些關(guān)于 Tcl 的簡單介紹,以便與本文一起追蹤。
第一點是,Tcl 處理的都是字符串。變量通常被當作字符串處理,但可以自動切換類型和內(nèi)部表示(這一點你通常無法看到)。函數(shù)可以把它們的字符串參數(shù)解釋為數(shù)字(??expr?
?),并且只通過值傳遞。字符串通常使用雙引號或大括號來劃分。雙引號允許變量擴展和轉(zhuǎn)義序列,而大括號則完全沒有擴展。
第二點是 Tcl 語句可以用分號隔開,但通常不這樣。語句行可以用反斜杠字符來分割,然而,典型的做法是將多行語句放在大括號內(nèi),以避免需要這樣做。大括號只是更簡單,下面的代碼格式也反映了這一點。大括號允許對字符串進行延遲求值。在 Tcl 進行變量替換之前,值被傳遞給函數(shù)。
最后,Tcl 使用方括號進行命令替換。方括號之間的任何東西都會被送到 Tcl 解釋器的一個新的遞歸調(diào)用中進行求值。這對于在表達式中間調(diào)用函數(shù)或為函數(shù)生成參數(shù)是很方便的。
過程
雖然在這個游戲中沒有必要,但我先舉一個在 Tcl 中定義函數(shù)的例子,你可以在以后使用:
使用 ??proc?
? 將其設(shè)定為一個函數(shù)(或過程)定義。接下來是函數(shù)的名稱。然后是一個包含參數(shù)的列表;在本例中是一個參數(shù) ??{start}?
? ,然后是函數(shù)主體。注意,主體的大括號在這一行開始,它不能在下面一行。該函數(shù)返回一個值。返回值是一個復(fù)合求值(方括號),它從讀取系統(tǒng)時鐘 ??[clock seconds]?
? 開始,并進行數(shù)學(xué)運算以減去 ??$start?
? 參數(shù)。
設(shè)置、邏輯和完成
你可以在這個游戲的其余部分增加更多的細節(jié),進行一些初始設(shè)置,對玩家的猜測進行迭代,然后在完成后打印結(jié)果:
前面的 ??set?
? 語句建立變量。前兩個求值表達式用于識別 1 到 100 之間的隨機數(shù),下一個保存系統(tǒng)時鐘啟動時間。
??puts?
? 和 ??gets?
? 命令用于來自玩家的輸出和輸入。我使用的 ??puts?
? 暗示輸出是標準輸出。??gets?
? 需要定義輸入通道,所以這段代碼指定 ??stdin?
? 作為用戶的終端輸入源。
當 ??puts?
? 省略行末終止符時,需要 ??flush stdout?
? 命令,因為 Tcl 緩沖了輸出,在需要下一個 I/O 之前可能不會被顯示。
從這里開始,??while?
? 語句說明了循環(huán)控制結(jié)構(gòu)和條件邏輯,需要給玩家反饋并最終結(jié)束循環(huán)。
最后的 ??set?
? 命令調(diào)用我們的函數(shù)來計算游戲的耗時秒數(shù),接著是收集到的統(tǒng)計數(shù)字來結(jié)束游戲。
玩吧!
繼續(xù)學(xué)習(xí)
當我開始這個練習(xí)時,我懷疑回到 90 年代末的流行語言對我有多大的幫助。一路走來,我發(fā)現(xiàn) Tcl 有幾處讓我非常喜歡的地方,我最喜歡的是方括號內(nèi)的命令求值。與其他許多過度使用復(fù)雜閉包結(jié)構(gòu)的語言相比,它似乎更容易閱讀和使用。我以為它是一種 ??已消亡的語言??,但實際上它仍在蓬勃發(fā)展,并在多個平臺上得到支持。我學(xué)到了一些新的技能,并對這種古老的語言有了新的認識。
在 ??https://www.tcl-lang.org?? 上查看官方網(wǎng)站。你可以找到最新的源代碼、二進制發(fā)行版、論壇、文檔,以及仍在進行的會議信息的參考。