来自tcl过程的变量/数组

时间:2013-04-18 12:57:49

标签: variables tcl procedures

我如何在程序之外传递一些变量/数组?

让我说我的程序'myproc'带有输入参数{a b c d e},例如

myproc {a b c d e} { 
    ... do something
    (calculate arrays, lists and new variables)
}

在这个过程中,我想从变量a-e中计算一个数组phiN(1),phiN(2),... phiN(18),它本身就是一个列表,例如

set phiN(1) [list 1 2 3 4 5 6 7 8 9];

(假设值1-9是根据输入变量a-e计算出来的)。我想计算一些其他参数alpha和beta

set alpha [expr a+b];
set beta  [expr c+d];

无论如何,我不想在程序之外传递这些新的计算变量。与matlab相比,我只想编写sg,以便将这些变量置于'函数'之外。

[phiN,alpha,beta] = myproc{a b c d e}

有谁知道如何处理tcl?谢谢!

1 个答案:

答案 0 :(得分:2)

有几种选择:

  1. 返回列表并使用外部lassign
    例如:

    proc myproc {a b c d e} {
        set alpha [expr {$a+$b}]
        set beta [expr {$c+$d}]
        return [list $alpha $beta]
    }
    
    lassign [myproc 1 2 3 4 5] alpha beta
    

    如果返回值而不是数组,这很好。

  2. 使用upvar并提供数组/变量的名称作为参数
    例如:

    proc myproc {phiNVar a b c d e} {
        upvar 1 $phiNVar phiN
        # Now use phiN as local variable
        set phiN(1) [list 1 2 3 4 5 6 7 8 9]
    }
    
    # Usage
    myproc foo 1 2 3 4 5
    foreach i $foo(1) {
         puts $i
    }
    
  3. 结合使用
    例如:

    proc myproc {phiNVar a b c d e} {
        uplevel 1 $phiNVar phiN
        set alpha [expr {$a+$b}]
        set beta [expr {$c+$d}]
        set phiN(1) [list 1 2 3 4 5 6 7 8 9]
        return [list $alpha $beta]
    }
    
    lassign [myproc bar 1 2 3 4 5] alpha beta
    foreach i $bar(1) {
         puts $i
    }
    
  4. 编辑:正如Donal所说,也有可能返回一个字典:

    dict是一个Tcl列表,其中奇数元素是键,偶数元素是值。您可以使用array get将数组转换为dict,并将dict转换回array set的数组。您也可以使用dict本身 实施例

         proc myproc {a b c d e} {
            set alpha [expr {$a+$b}]
            set beta [expr {$c+$d}]
            set phiN(1) [list 1 2 3 4 5 6 7 8 9]
            return [list [array get phiN] $alpha $beta]
        }
    
        lassign [myproc 1 2 3 4 5] phiNDict alpha beta
        array set bar $phiNDict
        foreach i $bar(1) {
             puts $i
        }
        # Use the [dict] command to manipulate the dict directly
        puts [dict get $phiNDict 1]
    

    有关更多提示(这是关于数组,但也可以应用于值),请参阅this wiki entry