Passing list to Tcl procedure

前端 未结 3 787
日久生厌
日久生厌 2021-02-13 02:56

What is the canonical way to pass a list to a Tcl procedure?

I\'d really like it if I could get it so that a list is automatically expanded into a variable number of arg

相关标签:
3条回答
  • 2021-02-13 02:58

    It depends on the version of Tcl you're using, but: For 8.5:

    set mylist {a b c}
    myprocedure option1 option2 {*}$mylist
    

    For 8.4 and below:

    set mylist {a b c}
    eval myprocedure option1 option2 $mylist
    # or, if option1 and 2 are variables
    eval myprocedure [list $option1] [list $option2] $mylist
    # or, as Bryan prefers
    eval myprocedure \$option1 \$option2 $mylist
    
    0 讨论(0)
  • 2021-02-13 03:04

    It might be useful to note that passing your command to catch will also solve this problem:

    set a {b c}
    if [catch "myprocedure option1 option2 $a"] {
        # handle errors
    }
    

    This should probably only be used if you want to handle errors in myprocedure at this point in your code so that you don't have to worry about rethrowing any errors that get caught.

    0 讨论(0)
  • 2021-02-13 03:09

    To expand on RHSeeger's answer, you would code myprocedure with the special args argument like this:

    proc myprocedure {opt1 opt2 args} {
        puts "opt1=$opt1"
        puts "opt2=$opt2"
        puts "args=[list $args]" ;# just use [list] for output formatting
        puts "args has [llength $args] elements"
    }
    
    0 讨论(0)
提交回复
热议问题