如何将字符串传递给tcl中的函数?

时间:2013-07-29 15:52:11

标签: tcl proc

我有这样的功能:

proc test { {isSet "false"} } {
   if {isSet  == "true"} {
    # do something
   }
}

但是当我调用此proc时,如何传递falsetrue

test "false" or test false?

1 个答案:

答案 0 :(得分:3)

你做错了(忽略了你在isSet条件表达式中使用单词if这一事实无效的事实。而是做

proc test {{isSet "false"}} {
   if {$isSet} {
       # do something
   }
}

这样您就可以按照自己的意愿致电test proc:

test 0
test 1
test [expr {1 == 0}]
test yes
test false
test "no"
test {true}
test "off"

等...

基本思想是Tcl解释器将尝试解释 isSet变量中包含的值作为布尔类型的值;它有一套规则可以做到这一点:

  • 整数类型的值0为false。
  • 与整数类型的0不同的值为真。
  • 其他所有内容首先转换为字符串然后
    • 字面上等于yestrueon之一的字符串为真;
    • 字面上等于nofalseoff之一的字符串为false。

Tcl_GetBoolean() manual

中描述了将字符串解释为布尔值的规则

你在假设中犯了另一个错误:Tcl没有明确的字符串和布尔类型(因为它是无类型的)所以"false"false与Tcl解释器完全相同它解析你的脚本的时间是双引号和花括号在Tcl 中用于分组,不用于指定文字类型(并且Tcl没有文字)。所以我建议从the tutorial开始,以更好地掌握这些想法。

当我描述将值解释为boolean时我提到的类型是Tcl值的内部并且不是用户可见的 - 是的,内部Tcl缓存值的“本机”表示,因此当您执行set x [expr {1 + 2}]时,内部分配给x的值将具有整数类型,但这实际上是一个实现细节。