我刚刚在了解Tcl。我只看到了一些,例如创建一个变量(并初始化它),您可以这样做
set varname value我正在熟悉这样一个事实:基本上所有东西都是字符串,比如上面的"value“,但是" varname”得到了一种特殊的待遇--我猜是因为"set“内置函数,所以varname被解释为一个字符串,而是一个名称。稍后我可以使用$varname访问该值,这对我来说很好,它用于指定varname不被视为字符串。我现在正在读关于列表和几个命令的文章,这让我有点困惑
set colors {"aqua" "maroon" "cyan"}
puts "list length is [llength $colors]"
lappend colors "purple"很明显,"lappend“是另一个类似set的函数,它可以将第一个参数解释为名称,而不是字符串,但是为什么它们不使其长度相同(不需要$)?
我认为这只是一个惯例,一般情况下,当你“读”一个变量时,你需要$,而不是“写”。
发布于 2021-01-21 17:27:32
名字是字符串。或者更确切地说,字符串是一个名称,因为它被用作名称。而$在Tcl中的意思是“立即读取此变量”,而在其他一些语言中,它真正的意思是“这里是变量名”。
从变量中读取的$blah语法是一种方便的语法,它大约是用来执行[set blah]的(只有一个参数)。对于简单的名称,它们成为相同的字节码,但是$…表单不能处理所有奇怪的边缘情况(通常使用生成的名称)。如果命令(如set、lappend、unset或incr)使用变量名,这是因为它将写入该变量,并且通常会记录为使用varName (当然是变量名)或类似的东西。刚刚读取值的东西(例如,llength或lindex)将直接使用值,而不是变量的名称,而由调用方使用他们想要的值(可能是$blah或[call something] )来提供值。
特别是,如果你有:
proc ListRangeBy {from to {by 1}} {
set result {}
for {set x $from} {$x <= $to} {incr x $by} {
lappend result $x
}
return $result
}然后你就可以:
llength [ListRangeBy 3 77 8]和
set listVar [ListRangeBy 3 77 8]
llength $listVar并从llength中获取完全相同的值。llength不需要知道发生了什么特别的事情。
发布于 2021-01-21 19:59:47
另一个问题是:哪些Tcl命令适合于列表文本
计算列表文本的元素是有效的:
llength {my dog has fleas}但是在文字中添加一个新元素是没有意义的
lappend {my dog has fleas} and ticks(这实际上是有效的Tcl,但它设置了奇数变量${my dog has fleas})
这样做更明智:
set mydog {my dog has fleas}
lappend mydog and tickshttps://stackoverflow.com/questions/65831542
复制相似问题