当前位置: 首页 > 科技观察

通过“猜数字”游戏学习Tcl

时间:2023-03-19 14:15:45 科技观察

我的Tcl之旅始于最近需要自动化一个困难的基于Java的命令行配置工具。我使用Ansible进行一些自动化编程,偶尔使用expect模块。坦率地说,我发现此模块的用途有限,原因是:难以对相同的提示进行排序、难以捕获额外步骤的值、控制逻辑的灵活性有限等。有时您可以改用shell模块。但有时您会遇到特殊、过于复杂且似乎无法自动化的命令行程序。就我而言,我正在自动安装我公司的程序。最后的配置步骤只能通过命令行完成,通过几个非标准的、重复的提示和需要捕获的数据输出。幸运的是,传统的Expect是唯一的答案。使用Expect的基本功能不需要对Tcl有深入的了解,但是您了解得越多,您就能从中获得越多的力量。这是后续文章的主题。现在,我探索了Tcl的基本语言结构,包括用户输入、输出、变量、条件、循环和简单函数。要在Linux系统上安装Tcl,我使用这个:#dnfinstalltcl#whichtclsh/bin/tclsh在macOS上,你可以使用Homebrew安装最新的Tcl:$brewinstalltcl-tk$whichtclsh/usr/local/bin/tclshTcl中的猜测数字从创建基本的可执行脚本numgame.tcl开始:$touchnumgame.tcl$chmod755numgame.tcl然后开始在你的文件中编码,标题为Theusual#!:#!/usr/bin/tclsh下面是对Tcl的一些简要介绍,以配合本文。第一个是Tcl处理字符串。变量通常被视为字符串,但可以自动切换类型和内部表示(您通常看不到)。函数可以将其字符串参数解释为数字(expr),并且仅按值传递。字符串通常使用双引号或大括号分隔。双引号允许变量扩展和转义序列,而花括号根本不允许扩展。第二点,Tcl语句可以用分号分隔,但通常不是。语句行可以用反斜杠字符分隔,但是,通常将多行语句括在花括号中以避免需要这样做。大括号更简单,下面的代码格式反映了这一点。大括号允许对字符串进行惰性求值。在Tcl进行变量替换之前将值传递给函数。最后,Tcl使用方括号进行命令替换。方括号之间的任何内容都将发送到Tcl解释器以在新的递归调用中进行评估。这对于在表达式中间调用函数或为函数生成参数很方便。这个游戏不需要程序,但我先举一个例子,在Tcl中定义一个函数,你可以稍后使用:procused_time{start}{return[expr[clockseconds]-$start]}usingprocSet它作为函数(或过程)定义。接下来是函数的名称。然后是一个包含参数的列表;在这种情况下是一个参数{start},然后是函数体。请注意,主体的花括号从这一行开始,不能在下一行。该函数返回一个值。返回值是一个复合评估(方括号),它读取从[时钟秒]开始的系统时钟,并进行数学运算以减去$start参数。设置、逻辑和完成你可以为这个游戏的其余部分添加更多细节,做一些初始设置,迭代玩家的猜测,并在完成后打印结果:setnum[exprround(rand()*100)]setstarttime[时钟秒数]setguess-1setcount0puts"Guessanumberbetween1and100"while{$guess!=$num}{incrcountputs-nonewline"==>"flushstdoutgetsstdinguessif{$guess<$num}{puts“太小,再试一次”}elseif{$guess>$num}{puts“太大,再试一次”}else{puts“没错!”}}setused[used_time$starttime]之前的set语句“您在$count次尝试和$usedelapsedseconds之后猜测值$num”创建变量。前两个求值表达式用于识别1到100之间的随机数,下一个保存系统时钟开始时间。puts和gets命令用于播放器的输出和输入。我使用puts来暗示输出是标准输出。gets需要定义一个输入通道,所以这段代码指定stdin为用户的终端输入源。当puts省略行尾终止符时,需要flushstdout命令,因为Tcl缓冲输出并且可能不会显示直到需要下一个I/O。从这里开始,while语句说明了为玩家提供反馈并最终结束循环所需的循环控制结构和条件逻辑。最后的set命令调用我们的函数来计算游戏经过的秒数,然后是收集的统计数据以结束游戏。$./numgame.tclGuessanumberbetween1and100==>100太大,再试一次==>50太大,再试一次==>25太大,再试一次==>12太大,再试一次==>6太大大,再试一次==>3没错!在6次尝试和20秒的持续学习后你猜到了值3当我开始这个练习时,我怀疑回到90年代后期的流行语言对我有多大帮助。一路上,我发现了一些我真正喜欢的关于Tcl的东西,我最喜欢的是方括号内命令的求值。它似乎比许多其他过度使用复杂闭包结构的语言更容易阅读和使用。我认为它是一种死语言,但它实际上仍在蓬勃发展并在多个平台上得到支持。我学到了一些新技能,并对这门古老的语言有了新的认识。查看官方网站https://www.tcl-lang.org。您可以找到对最新源代码、二进制分发、论坛、文档和正在进行的会议的信息的引用。