【问题标题】:apparent inconsistency read/write variable明显不一致的读/写变量
【发布时间】:2021-01-21 16:22:07
【问题描述】:

我现在正在学习 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 的函数,它可以将第一个参数解释为名称而不是字符串,但是为什么他们不让它 llength 相同(不需要 $)?

我认为这只是一个约定,一般来说,当你“读取”一个变量时,你需要 $ 而你不需要“写入”。

【问题讨论】:

    标签: tcl


    【解决方案1】:

    换个角度看问题:哪些 Tcl 命令适用于列表 literals

    计算列表文字的元素是有效的:

    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 ticks
    

    【讨论】:

      【解决方案2】:

      名称是字符串。 或者更确切地说,字符串是名称,因为它被用作名称。而$ 在 Tcl 中的意思是“立即读取这个变量”,不像在其他一些语言中它真正的意思是“这是一个变量名”。

      用于读取变量的$blah 语法是一种方便的语法,近似代表执行[set blah](只有一个参数)。对于简单的名称,它们变成了相同的字节码,但是$… 表单并不能像其他表单那样处理所有奇怪的边缘情况(通常使用生成的名称)。如果命令(例如 setlappendunsetincr)采用变量名称,这是因为它将写入该变量,并且通常会记录为采用 varName (当然是变量名)或类似的东西。只读取值的东西(例如,llengthlindex)将直接获取值而不是变量的名称,并且由调用者使用他们想要的任何值来提供值,也许是 $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 不需要知道发生了什么特别的事情。

      【讨论】:

      • ListRangeBy 3 77 8 的输出是3 11 19 27 35 43 51 59 67 75;它的长度是10
      • 谢谢@Donal 我开始更好地理解它了
      • @CDevel,这是从这个答案中学到的重要一课:“它通常会被记录为采用 varName”——书签http://www.tcl-lang.org/man/tcl8.6/TclCmd/contents.htm
      • 有没有办法在过程中就地修改列表(因此不必返回新列表并将其设置在调用者代码范围内)?
      猜你喜欢
      • 2021-10-09
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2018-08-31
      • 2015-01-05
      相关资源
      最近更新 更多