2015-12-15 156 views
0

使用tcl,我想将可变参数传递给函数。 我想这码Tcl将变量作为参数传递给函数

proc launch_proc { msg proc_name {params {}} } { 
    puts "params launch_proc is $params \n" 
} 
proc test { param } {  
    puts "param test is $param \n" 
    launch_proc "1.5.2 test param" test_standard {{*}$param param1 param2 param3" 
    }  
} 
test value 

- > PARAMS launch_proc是{*} $ PARAM参数1参数2参数3" $参数是不计算(我用的TCL 8.5)

+0

您只能传递3个参数到'launch_proc',但是你传递的是多于(不正确?)的那个。此外,引用的问题也是如此。 – Dinesh

+0

您正在将字符串'{*} $ param param1 param2 param3'传递给'launch_proc'。它看起来不像你想要的。你的意思是'launch_proc'1.5.2 test param“test_standard”{*} $ param param1 param2 param3“'? – Jerry

+0

或者更好'也许'launch_proc“1.5.2测试参数”test_standard [list {*} $参数param1 param2 param3]' – Jerry

回答

0

你需要upvar,并使用list当你构建PARAMS列表launch_proc

proc test {varname} { 
    upvar 1 $varname value 
    puts "param test is $varname => $value" 
    launch_proc "1.5.2 test param" test_standard [list {*}$value par1 par2 par3] 
} 

proc launch_proc {msg proc_name {params {}}} { 
    puts "params launch_proc: [join $params ,]" 
} 

set value {"a b c" "d e f" "g h i"} 
test value 
param test is value => "a b c" "d e f" "g h i" 
params launch_proc: a b c,d e f,g h i,par1,par2,par3 
0

你传递一个列表,需要改为发送每次em作为proc的参数。

proc test {p1 p2 p3} { 
     puts "$p1 - $p2 - $p3" 
} 

set value {one two three} 

# This should work in tcl 8.5+ 
test {*}$value 

set value {four five six} 

# For tcl < 8.5 
foreach {p1 p2 p3} $value { 
     test $p1 $p2 $p3 
     break 
} 

# or 

set value {seven eight nine} 

test [lindex $value 0] [lindex $value 1] [lindex $value 2] 

输出:

$ tclsh test.tcl 
one - two - three 
four - five - six 
seven - eight - nine 
2

的Tcl有这个使用关键字args作为参数列表的最后一个参数的支持。

下面是一个例子directly from the wiki

proc demo {first {second "none"} args} { 
    puts "first = $first" 
    puts "second = $second" 
    puts "args = $args" 
} 

demo one 
demo one two 
demo one two three four five 

结果

first = one 
second = none 
args = 
first = one 
second = two 
args = 
first = one 
second = two 
args = three four five 

您可以使用此展开语法,以及其作出以下两个调用demo等同。

demo one two three four five 
set params {three four five} 
demo one two {*}$params 
相关问题