2009-10-20 2 views
11

목록을 Tcl 프로 시저로 전달하는 표준 방법은 무엇입니까?목록을 Tcl 프로 시저로 전달

목록을 자동으로 다양한 인수로 확장 할 수 있다면 정말 좋겠다.

그래서 같은 무언가 :

set a {b c} 
myprocedure option1 option2 $a 

myprocedure option1 option2 b c 

은 동일합니다.

본인은 이전에이 사이트를 보았을 것이라고 확신하지만 온라인에서는 찾을 수 없습니다. 두 경우를 동등하게 만드는 데 필요한 도움과 코드를 제공해 주시면 감사하겠습니다.

표준 Tcl 규칙으로 간주됩니까? 아니면 내가 틀린 나무를 짖는 것인가?

+0

Ca 위대한 질문 어딘가에 "unwrap"이라는 단어를 추가하십시오 ("unwrap arguments"에서 가장 좋습니다)? 나는 그것을 찾기가 힘들었습니다 :-) – cfi

답변

14

그것은 당신이 사용하고있는 티클의 버전에 따라 다르지만 : 8.5의 경우 :

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 
+1

... 개인적으로 \ $ option1 \ $ option2가 [list $ opt1] [list $ optio2]보다 더 바람직하다고 생각합니다. 의도를 자세히 보여줍니다. 하나의 요소 목록을 만들려는 의도는 아니며, 이러한 변수에 대한 여분의 대체 라운드를 방지 (또는 방지)해야합니다. –

+0

8.4 이하에서이를 수행 할 수있는 표준 방법은 다음과 같습니다 :'eval [linsert $ mylist 0 myprocedure options1 option2]' –

+2

나는 canonical에 동의하지 않습니다 (그러나 우리는 다른 canon을 가지고 있을까요?). 그것은 틀림없이 가장 안전 합니다만, \ $ option1 \ $ option2보다 읽기 쉽지 않습니다. 그리고 여러분이 실제로 달성하고자하는 것을 다소 모호하게 만듭니다. –

0

RHSeeger의 대답에 확장하려면, 당신은 코드 것 : 아래 8.4의 경우

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

이런 특수한 args 인수를 가진 myprocedure :

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

필자는 필자가 myprocedure를 가변 인수 (즉, "args"사용)로 코딩해야한다고 동의하지 않습니다. 그렇게할지 여부는 전적으로 특정 호출자가 입력 값을 사용할 수있는 방법이 아니라 다양한 입력 값을 필요로하는지 여부에 달려 있습니다. – RHSeeger

0

catch에 명령을 전달하면이 문제를 해결할 수 있음을주의하는 것이 유용 할 수 있습니다 :

당신이 '돈 있도록 코드에서이 시점에서 myprocedure의 오류를 처리하는 경우는 아마에만 사용해야합니다
set a {b c} 
if [catch "myprocedure option1 option2 $a"] { 
    # handle errors 
} 

잡힐만한 오류를 다시 제기하는 것에 대해 걱정해야합니다.

관련 문제