成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

通過“猜數字”游戲學習 Tcl

系統 Linux
探索 Tcl 的基本語言結構,包括用戶輸入、輸出、變量、條件評估、循環和簡單函數。

我的 Tcl 之旅始于最近需要將一個困難的基于 Java 的命令行配置工具自動化。我使用 Ansible 做了一些自動化編程,偶爾也會使用 ??expect??? 模塊。坦率地說,我發現這個模塊的作用有限,原因包括:難以對相同的提示進行排序,難以捕捉到額外步驟的值,控制邏輯的靈活性有限,等等。有時你可以用 ??shell?? 模塊來代替。但有時你會遇到那種特立獨行、過于復雜的命令行程序,似乎無法實現自動化。

就我而言,我正在自動安裝我公司的一個程序。最后的配置步驟只能通過命令行來完成,通過幾個不規范的、重復的提示和需要捕捉的數據輸出。好在傳統的 Expect 是唯一的答案。要使用 Expect 的基本功能,并不需要對 Tcl 有很深的了解,但你了解的越多,你就能從它那里得到更多的力量。這是后續文章的話題。現在,我探討一下 Tcl 的基本語言結構,包括用戶輸入、輸出、變量、條件判斷、循環和簡單函數。

安裝 Tcl

在 Linux 系統上,我使用這個:

# dnf install tcl
# which tclsh
/bin/tclsh

在 macOS 上,你可以使用 ??Homebrew?? 來安裝最新的 Tcl:

$ brew install tcl-tk
$ which tclsh
/usr/local/bin/tclsh

在 Tcl 中猜數字

從創建基本的可執行腳本 ??numgame.tcl?? 開始:

$ touch numgame.tcl
$ chmod 755 numgame.tcl

接著在你的文件中開始編碼,標題是通常的 #!:

#!/usr/bin/tclsh

這里有一些關于 Tcl 的簡單介紹,以便與本文一起追蹤。

第一點是,Tcl 處理的都是字符串。變量通常被當作字符串處理,但可以自動切換類型和內部表示(這一點你通常無法看到)。函數可以把它們的字符串參數解釋為數字(??expr??),并且只通過值傳遞。字符串通常使用雙引號或大括號來劃分。雙引號允許變量擴展和轉義序列,而大括號則完全沒有擴展。

第二點是 Tcl 語句可以用分號隔開,但通常不這樣。語句行可以用反斜杠字符來分割,然而,典型的做法是將多行語句放在大括號內,以避免需要這樣做。大括號只是更簡單,下面的代碼格式也反映了這一點。大括號允許對字符串進行延遲求值。在 Tcl 進行變量替換之前,值被傳遞給函數。

最后,Tcl 使用方括號進行命令替換。方括號之間的任何東西都會被送到 Tcl 解釋器的一個新的遞歸調用中進行求值。這對于在表達式中間調用函數或為函數生成參數是很方便的。

過程

雖然在這個游戲中沒有必要,但我先舉一個在 Tcl 中定義函數的例子,你可以在以后使用:

proc used_time {start} {
return [expr [clock seconds] - $start]
}

使用 ??proc?? 將其設定為一個函數(或過程)定義。接下來是函數的名稱。然后是一個包含參數的列表;在本例中是一個參數 ??{start}?? ,然后是函數主體。注意,主體的大括號在這一行開始,它不能在下面一行。該函數返回一個值。返回值是一個復合求值(方括號),它從讀取系統時鐘 ??[clock seconds]?? 開始,并進行數學運算以減去 ??$start?? 參數。

設置、邏輯和完成

你可以在這個游戲的其余部分增加更多的細節,進行一些初始設置,對玩家的猜測進行迭代,然后在完成后打印結果:

set num [expr round(rand()*100)]
set starttime [clock seconds]
set guess -1
set count 0

puts "Guess a number between 1 and 100"

while { $guess != $num } {
incr count
puts -nonewline "==> "
flush stdout
gets stdin guess

if { $guess < $num } {
puts "Too small, try again"
} elseif { $guess > $num } {
puts "Too large, try again"
} else {
puts "That's right!"
}
}

set used [used_time $starttime]

puts "You guessed value $num after $count tries and $used elapsed seconds"

前面的 ??set?? 語句建立變量。前兩個求值表達式用于識別 1 到 100 之間的隨機數,下一個保存系統時鐘啟動時間。

??puts?? 和 ??gets?? 命令用于來自玩家的輸出和輸入。我使用的 ??puts?? 暗示輸出是標準輸出。??gets?? 需要定義輸入通道,所以這段代碼指定 ??stdin?? 作為用戶的終端輸入源。

當 ??puts?? 省略行末終止符時,需要 ??flush stdout?? 命令,因為 Tcl 緩沖了輸出,在需要下一個 I/O 之前可能不會被顯示。

從這里開始,??while?? 語句說明了循環控制結構和條件邏輯,需要給玩家反饋并最終結束循環。

最后的 ??set?? 命令調用我們的函數來計算游戲的耗時秒數,接著是收集到的統計數字來結束游戲。

玩吧!

$ ./numgame.tcl
Guess a number between 1 and 100
==> 100
Too large, try again
==> 50
Too large, try again
==> 25
Too large, try again
==> 12
Too large, try again
==> 6
Too large, try again
==> 3
That's right!
You guessed value 3 after 6 tries and 20 elapsed seconds

繼續學習

當我開始這個練習時,我懷疑回到 90 年代末的流行語言對我有多大的幫助。一路走來,我發現 Tcl 有幾處讓我非常喜歡的地方,我最喜歡的是方括號內的命令求值。與其他許多過度使用復雜閉包結構的語言相比,它似乎更容易閱讀和使用。我以為它是一種 ??已消亡的語言??,但實際上它仍在蓬勃發展,并在多個平臺上得到支持。我學到了一些新的技能,并對這種古老的語言有了新的認識。

在 ??https://www.tcl-lang.org?? 上查看官方網站。你可以找到最新的源代碼、二進制發行版、論壇、文檔,以及仍在進行的會議信息的參考。

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2023-02-13 08:26:28

猜數字Basic

2021-10-04 18:49:46

Fortran 77語言猜數字

2021-01-12 06:42:50

Lua腳本語言編程語言

2022-06-03 16:59:13

編程語言Awk

2023-01-13 18:55:09

游戲Ada編程語言

2023-09-08 10:50:24

Tcl/TkWish

2019-09-23 09:11:02

Python文本編輯器操作系統

2020-12-28 06:29:31

Bash互動游戲Linux

2015-09-29 09:38:50

Java程序猜大小

2020-12-09 11:42:18

WiFi IoT鴻蒙開發

2021-01-19 09:35:36

Python視頻游戲編程語言

2021-04-22 09:57:37

Random方法游戲

2021-04-13 06:35:13

Elixir語言編程語言軟件開發

2011-07-28 15:07:23

iOS猜數游戲

2012-03-28 22:12:00

游戲

2012-03-26 15:08:22

我畫你猜

2021-01-03 16:30:34

Rust編程語言

2021-01-14 08:55:20

C語言編程

2015-03-24 19:48:24

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美日韩精品 | 欧美久久久网站 | 成人在线中文字幕 | 亚洲国产精品久久久久 | 国产欧美一级二级三级在线视频 | 四虎影院在线观看免费视频 | 中文字幕国产高清 | 特黄特色大片免费视频观看 | 黄色亚洲 | 一级片视频免费 | 精品国产一区二区三区久久 | 精品二区视频 | 九九热在线视频观看这里只有精品 | 欧洲av一区 | 91精品免费 | 国产成视频在线观看 | 欧美涩涩网 | 在线a视频网站 | 免费观看一级特黄欧美大片 | 四虎av电影 | 国产美女精品视频 | 精品粉嫩超白一线天av | 国产精品久久久av | 一区二区精品在线 | 美女福利视频一区 | 精品免费国产视频 | 日韩有码一区 | 99影视 | 午夜精品一区二区三区在线播放 | 找个黄色片 | 国产精品久久久久国产a级 欧美日韩国产免费 | 久久久国产精品 | 欧美精品久久久久 | 亚洲天天干 | 久久国产精品91 | 色播久久久 | 亚洲色视频| 高清久久久 | 99久久婷婷国产综合精品电影 | 欧美日韩电影一区二区 | 天天视频一区二区三区 |