2017-03-14 5 views
0

내 tcl 스크립트에는 반복되는 코드의 일부가 있으므로 프로 시저를 만들고 싶습니다.Tcl : 메인에서 프로 시저로 모든 변수 전달

이 부분은 수십 개의 변수를 사용합니다. 프로 시저에 인수로 전달하지 않으려합니다. 프로 시저에서 모든 변수를 볼 수있는 방법이 있습니까? (실제로 "main"을 "goto"와 같은 프로 시저로 분기 한 다음 돌아와서 메인에서 계속 진행하기를 원합니다).

편집 됨 : 절차가 아니어도되며 다른 방법을 제안하십시오. 중요한 부분은 main에서 함수/프로 시저로 전달되는 모든 변수/인수를 선언 할 필요가 없다는 것입니다.

예 :

proc dummy_proc {} { 
set var1 $var2 
set var2 $var3 
} 

set var2 2 
set var3 3 
dummy_proc 
puts "$var1 $var2" 
# should print "2 3" 

답변

2

이 바람직하지 일반적으로 가능하지만입니다라고합니다. 그러나 경우에 따라서는 반복 코드를 줄일 수 있습니다.

사용 upvar (https://www.tcl.tk/man/tcl8.6/TclCmd/upvar.htm) : upvar이 무엇

proc dummy_proc {} { 
    upvar var1 v1 
    upvar var2 v2 
    upvar var3 v3 

    set v1 $v2 
    set v2 $v3 
} 

호출자의 범위에 또 다른 변수를 참조하는 로컬 범위의 변수를 만드는 것입니다.

또는 당신은 또한 uplevel (https://www.tcl.tk/man/tcl8.6/TclCmd/uplevel.htm)를 사용하여 시도 할 수 있습니다 :

uplevel이 무엇
proc dummy_proc {} { 
    uplevel { 
     set var1 $var2 
     set var2 $var3 
    } 
} 

upvar 비슷하지만 대신 변수 참조를 만드는 실제로 호출자의 범위에서 코드를 실행합니다. 마치 일시적으로 반환하지 않고 호출자 함수로 돌아가서 코드를 실행하고 돌아 오는 것과 같습니다. 호출자의 범위에서 코드를 실행하므로 호출자의 범위에 표시된 모든 변수가 레벨 업된 코드에서 볼 수 있습니다. Uplevel은 함수 대신 매크로처럼 작동합니다.

+0

감사합니다. 중요한 부분은 main에서 함수/프로 시저로 전달되는 모든 변수/인수를 선언 할 필요가 없습니다. 그래서 이것은 나를 위해 작동하지 않을 것입니다. 나는 이것을 명확히하기 위해 나의 질문을 업데이트했다. – user2405602

+0

@ user2405602 : 고급 솔루션을 보았습니까? – slebetman

+0

나는 그것을 보았다, 나는 그것을 시험해 보았다. 그리고 나는 행복한 야영 자다! 그것은 잘 작동합니다. 고마워요. – user2405602

0

사용 global

proc dummy_proc {} { 
    global var2 var3 
    set var1 $var2 
    set var2 $var3 
} 

set var2 2 
set var3 3 
dummy_proc 
puts "$var1 $var2" 

당신이 전달하려는 전역의 많은이있는 경우, 당신은 몇 가지 foreach를 사용할 수 있지만이 방법이해야보다 그들을 모두 찾으려고.
예 : 모든 전역 인해 어렵게 코드 (변수에서 만들거나 변수 값이 갑자기 변경하는 방법을 직접 표시가 없습니다) 읽을 수 있도록 할 수 있다는 사실에 GLOBAL_<SOMEARG>

proc dummy_proc {} { 
    foreach glb [info globals GLOBAL_*] { 
    global $glb 
    } 
    ... 
} 
+0

감사합니다. 중요한 부분은 main에서 function/procedure로 전달되는 모든 변수/인수를 선언 할 필요가 없습니다. 그래서 이것은 나를 위해 작동하지 않을 것입니다. 나는 이것을 명확히하기 위해 나의 질문을 업데이트했다. – user2405602