自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

通過(guò)“猜數(shù)字”游戲?qū)W習(xí) Tcl

系統(tǒng) Linux
探索 Tcl 的基本語(yǔ)言結(jié)構(gòu),包括用戶輸入、輸出、變量、條件評(píng)估、循環(huán)和簡(jiǎn)單函數(shù)。

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

就我而言,我正在自動(dòng)安裝我公司的一個(gè)程序。最后的配置步驟只能通過(guò)命令行來(lái)完成,通過(guò)幾個(gè)不規(guī)范的、重復(fù)的提示和需要捕捉的數(shù)據(jù)輸出。好在傳統(tǒng)的 Expect 是唯一的答案。要使用 Expect 的基本功能,并不需要對(duì) Tcl 有很深的了解,但你了解的越多,你就能從它那里得到更多的力量。這是后續(xù)文章的話題?,F(xiàn)在,我探討一下 Tcl 的基本語(yǔ)言結(jié)構(gòu),包括用戶輸入、輸出、變量、條件判斷、循環(huán)和簡(jiǎn)單函數(shù)。

安裝 Tcl

在 Linux 系統(tǒng)上,我使用這個(gè):

# dnf install tcl
# which tclsh
/bin/tclsh

在 macOS 上,你可以使用 ??Homebrew?? 來(lái)安裝最新的 Tcl:

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

在 Tcl 中猜數(shù)字

從創(chuàng)建基本的可執(zhí)行腳本 ??numgame.tcl?? 開(kāi)始:

$ touch numgame.tcl
$ chmod 755 numgame.tcl

接著在你的文件中開(kāi)始編碼,標(biāo)題是通常的 #!:

#!/usr/bin/tclsh

這里有一些關(guān)于 Tcl 的簡(jiǎn)單介紹,以便與本文一起追蹤。

第一點(diǎn)是,Tcl 處理的都是字符串。變量通常被當(dāng)作字符串處理,但可以自動(dòng)切換類型和內(nèi)部表示(這一點(diǎn)你通常無(wú)法看到)。函數(shù)可以把它們的字符串參數(shù)解釋為數(shù)字(??expr??),并且只通過(guò)值傳遞。字符串通常使用雙引號(hào)或大括號(hào)來(lái)劃分。雙引號(hào)允許變量擴(kuò)展和轉(zhuǎn)義序列,而大括號(hào)則完全沒(méi)有擴(kuò)展。

第二點(diǎn)是 Tcl 語(yǔ)句可以用分號(hào)隔開(kāi),但通常不這樣。語(yǔ)句行可以用反斜杠字符來(lái)分割,然而,典型的做法是將多行語(yǔ)句放在大括號(hào)內(nèi),以避免需要這樣做。大括號(hào)只是更簡(jiǎn)單,下面的代碼格式也反映了這一點(diǎn)。大括號(hào)允許對(duì)字符串進(jìn)行延遲求值。在 Tcl 進(jìn)行變量替換之前,值被傳遞給函數(shù)。

最后,Tcl 使用方括號(hào)進(jìn)行命令替換。方括號(hào)之間的任何東西都會(huì)被送到 Tcl 解釋器的一個(gè)新的遞歸調(diào)用中進(jìn)行求值。這對(duì)于在表達(dá)式中間調(diào)用函數(shù)或?yàn)楹瘮?shù)生成參數(shù)是很方便的。

過(guò)程

雖然在這個(gè)游戲中沒(méi)有必要,但我先舉一個(gè)在 Tcl 中定義函數(shù)的例子,你可以在以后使用:

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

使用 ??proc?? 將其設(shè)定為一個(gè)函數(shù)(或過(guò)程)定義。接下來(lái)是函數(shù)的名稱。然后是一個(gè)包含參數(shù)的列表;在本例中是一個(gè)參數(shù) ??{start}?? ,然后是函數(shù)主體。注意,主體的大括號(hào)在這一行開(kāi)始,它不能在下面一行。該函數(shù)返回一個(gè)值。返回值是一個(gè)復(fù)合求值(方括號(hào)),它從讀取系統(tǒng)時(shí)鐘 ??[clock seconds]?? 開(kāi)始,并進(jìn)行數(shù)學(xué)運(yùn)算以減去 ??$start?? 參數(shù)。

設(shè)置、邏輯和完成

你可以在這個(gè)游戲的其余部分增加更多的細(xì)節(jié),進(jìn)行一些初始設(shè)置,對(duì)玩家的猜測(cè)進(jìn)行迭代,然后在完成后打印結(jié)果:

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?? 語(yǔ)句建立變量。前兩個(gè)求值表達(dá)式用于識(shí)別 1 到 100 之間的隨機(jī)數(shù),下一個(gè)保存系統(tǒng)時(shí)鐘啟動(dòng)時(shí)間。

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

當(dāng) ??puts?? 省略行末終止符時(shí),需要 ??flush stdout?? 命令,因?yàn)?Tcl 緩沖了輸出,在需要下一個(gè) I/O 之前可能不會(huì)被顯示。

從這里開(kāi)始,??while?? 語(yǔ)句說(shuō)明了循環(huán)控制結(jié)構(gòu)和條件邏輯,需要給玩家反饋并最終結(jié)束循環(huán)。

最后的 ??set?? 命令調(diào)用我們的函數(shù)來(lái)計(jì)算游戲的耗時(shí)秒數(shù),接著是收集到的統(tǒng)計(jì)數(shù)字來(lái)結(jié)束游戲。

玩吧!

$ ./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

繼續(xù)學(xué)習(xí)

當(dāng)我開(kāi)始這個(gè)練習(xí)時(shí),我懷疑回到 90 年代末的流行語(yǔ)言對(duì)我有多大的幫助。一路走來(lái),我發(fā)現(xiàn) Tcl 有幾處讓我非常喜歡的地方,我最喜歡的是方括號(hào)內(nèi)的命令求值。與其他許多過(guò)度使用復(fù)雜閉包結(jié)構(gòu)的語(yǔ)言相比,它似乎更容易閱讀和使用。我以為它是一種 ??已消亡的語(yǔ)言??,但實(shí)際上它仍在蓬勃發(fā)展,并在多個(gè)平臺(tái)上得到支持。我學(xué)到了一些新的技能,并對(duì)這種古老的語(yǔ)言有了新的認(rèn)識(shí)。

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

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2023-02-13 08:26:28

猜數(shù)字Basic

2021-01-12 06:42:50

Lua腳本語(yǔ)言編程語(yǔ)言

2021-10-04 18:49:46

Fortran 77語(yǔ)言猜數(shù)字

2022-06-03 16:59:13

編程語(yǔ)言Awk

2023-01-13 18:55:09

游戲Ada編程語(yǔ)言

2023-09-08 10:50:24

Tcl/TkWish

2019-09-23 09:11:02

Python文本編輯器操作系統(tǒng)

2020-12-09 11:42:18

WiFi IoT鴻蒙開(kāi)發(fā)

2020-12-28 06:29:31

Bash互動(dòng)游戲Linux

2015-09-29 09:38:50

Java程序猜大小

2021-01-19 09:35:36

Python視頻游戲編程語(yǔ)言

2021-04-22 09:57:37

Random方法游戲

2021-04-13 06:35:13

Elixir語(yǔ)言編程語(yǔ)言軟件開(kāi)發(fā)

2011-07-28 15:07:23

iOS猜數(shù)游戲

2012-03-26 15:08:22

我畫(huà)你猜

2012-03-28 22:12:00

游戲

2021-01-14 08:55:20

C語(yǔ)言編程

2021-01-03 16:30:34

Rust編程語(yǔ)言

2015-03-24 19:48:24

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)