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

如何将字符串传递给tcl中的函数?,tcl,proc,Tcl,Proc,我有这样一个函数: proc test { {isSet "false"} } { if {isSet == "true"} { # do something } } 但是当我调用这个过程时,如何传递false或true: test "false" or test false? 您做错了(忽略您在if条件表达式中使用裸词isSet的事实,该表达式不起作用)。取而代之的是 proc test {{isSet "false"}} { if {$isSet} {

我有这样一个函数:

proc test { {isSet "false"} } {
   if {isSet  == "true"} {
    # do something
   }
}
但是当我调用这个过程时,如何传递
false
true

test "false" or test false?
您做错了(忽略您在
if
条件表达式中使用裸词
isSet
的事实,该表达式不起作用)。取而代之的是

proc test {{isSet "false"}} {
   if {$isSet} {
       # do something
   }
}
这将允许您按自己的意愿调用
测试
程序:

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

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

  • 整数类型的值0为false
  • 与整数类型的0不同的值为true
  • 其他所有内容首先转换为字符串,然后
    • 一个字符串,字面上等于
      yes
      true
      on
      中的一个为true
    • 字面上等于
      no
      false
      off
      之一的字符串为false
中描述了用于将字符串解释为布尔值的规则

您在假设中犯了另一个错误:Tcl没有显式的字符串和布尔类型(因为它是无类型的),因此
“false”
false
对于Tcl解释器在解析脚本时是完全一样的,因为在Tcl中使用双引号和大括号进行分组,不用于指定文字类型(并且Tcl没有文字)。因此,我建议从一开始就更好地掌握这些想法

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

您做错了(忽略您在
if
条件表达式中使用裸字
isSet
这一事实,该表达式不起作用)。取而代之的是

proc test {{isSet "false"}} {
   if {$isSet} {
       # do something
   }
}
这将允许您按自己的意愿调用
测试
程序:

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

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

  • 整数类型的值0为false
  • 与整数类型的0不同的值为true
  • 其他所有内容首先转换为字符串,然后
    • 一个字符串,字面上等于
      yes
      true
      on
      中的一个为true
    • 字面上等于
      no
      false
      off
      之一的字符串为false
中描述了用于将字符串解释为布尔值的规则

您在假设中犯了另一个错误:Tcl没有显式的字符串和布尔类型(因为它是无类型的),因此
“false”
false
对于Tcl解释器在解析脚本时是完全一样的,因为在Tcl中使用双引号和大括号进行分组,不用于指定文字类型(并且Tcl没有文字)。因此,我建议从一开始就更好地掌握这些想法


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

两者都可以,但测试“false”更正确。两者都可以,但测试“false”更正确。+1另一种可能是使用
字符串为布尔值,
字符串在某些组合中为true
字符串为false
。我要指出的是,它们只有在解析用户值时才真正有用(其中“
you betcha!
”是输入的一种明显的可能性),而不是来自程序的值。+1另一种可能性是在某种组合中使用
string is boolean
string is true
string is false
。我要指出的是,它们只有在解析用户值时才真正有用(其中“
youbetcha!
”是输入的明显可能性),而不是来自程序的值。