Passerer liste til Tcl prosedyren

stemmer
12

Hva er den kanoniske måten å passere en liste til en Tcl prosedyren?

Jeg vil veldig gjerne det hvis jeg kunne få det slik at en liste automatisk utvidet til et variabelt antall argumenter.

Slik at noe sånt som:

set a {b c}
myprocedure option1 option2 $a

og

myprocedure option1 option2 b c

er ekvivalente.

Jeg er sikker på at jeg så dette før, men jeg kan ikke finne den noe sted på nettet. Alle hjelpe (og kode) for å gjøre begge tilfeller tilsvarende ville være verdsatt.

Er dette ansett som en standard Tcl konvensjonen. Eller er jeg selv bjeffe opp feil tre?

Publisert på 20/10/2009 klokken 19:11
kilden bruker
På andre språk...                            


3 svar

stemmer
16

Det avhenger av hvilken versjon av Tcl du bruker, men: For 8.5:

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

For 8.4 og nedenfor:

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
Svarte 20/10/2009 kl. 19:35
kilden bruker

stemmer
0

Å utvide RHSeeger svar, ville du kode myprocedure med den spesielle argsargument som dette:

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"
}
Svarte 21/10/2009 kl. 00:31
kilden bruker

stemmer
0

Det kan være nyttig å merke seg at passerer kommandoen til fangsten vil også løse dette problemet:

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

Dette bør sannsynligvis bare brukes hvis du ønsker å håndtere feil i myprocedure på dette punktet i koden din, slik at du ikke trenger å bekymre deg for rethrowing eventuelle feil som blir fanget.

Svarte 15/05/2015 kl. 02:04
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more