2011-02-15 10 views
3

tcl에 C++ #define과 동일한 명령이 있습니까? 나는 proc 함수의 오버로딩을 사용하여 "정의"를 구현하는 방법을 보았고, 누군가가 더 근원적 인 방법을 알고 있는지 알고 싶었다.tcl에서 #define과 동일합니까?

+3

* 정말로 *하려고합니까? 컴파일 타임 해킹은 동적 언어에서 가치가 거의 없습니다. – delnan

+0

나는 foo $ a $ b $ c $ d와 foo $ a $ b $ c $ e 을 반복하는 함수를 가지고 있으므로 foo_e와 foo_d를 모두 대신 정의하려고합니다. –

답변

4

Tcl은 통역에 aliases to procedures을 정의 할 수있는 메커니즘이 있습니다.

당신이

proc foo {one two three} {do something with $one $two $three} 

이 있고 당신은 항상 $ a를 전달하고 $ 처음 두 인자로, 당신이 쓸 수 b를하고 찾을 경우 : 당신이 말할 수있는 지금

interp alias {} foo_ab {} foo $a $b 

을 그리고 :

foo_ab $d ;# same as "foo $a $b $d" 
foo_ab $e ;# same as "foo $a $b $e" 

예 :

proc foo {one two three} {puts [join [list $one $two $three] :]} 
set a Hello 
set b World 
interp alias {} foo_ab {} foo $a $b 
foo_ab example ;# prints "Hello:World:example" 

interp alias 명령의 빈 괄호는 현재 해석기를 나타냅니다. 슬레이브 통역사를 통해 많은 재미있는 일을 할 수 있습니다.

interp alias {} foo_ab {} foo $a $b 

당신이 호출 될 때 값을 사용해야하는 경우, 당신이 필요합니다

1

"동일한 인수를 받는다"는 것은 동일한 것을 반복적으로 전달한다는 의미이다 값이 $a, $b$c 인 경우 함수 매개 변수 대신 전역 변수를 사용하는 것이 좋습니다. 함수를 호출하기 전에 값을 저장 한 다음 함수 호출을 foo $d 등으로 단순화하십시오.

2

또는 d 및 e를 모두 기본값으로 입력 매개 변수로 사용할 수 있도록 정의 할 수 있습니다 (예 : 빈 문자열).

proc foo {a b c {d ""} {e ""} }..... 

당신은 args 예를 들어, 각각의 값을 포함하는 목록을 만들 것입니다 당신이 단어 args을 사용할 수 있습니다 입력 매개 변수의 알 수없는 번호를 가질려고하는 경우

proc foo {a b c args } { 
    foreach bar $args { 
     #do whatever... 
    } 
    } 

환호 브라이언

+0

현재, 디폴트의 ​​파라미터는 인수리스트의 말미에만 붙을 수 있습니다 (말미의'args'를 제외하다). –

4

interp alias의 사용은 별명이 생성 된 시간에 ab의 내용을 사용할 수 있습니다 대신 도우미 절차 :

: 8.5에서

proc foo_ab args { 
    global a b 
    uplevel 1 [list foo $a $b {*}$args] 
    # Or this in older Tcl: uplevel 1 [list foo $a $b] $args 
} 

,이 또한 별칭과 apply로 기록 될 수있다

interp alias {} foo_ab {} apply {args { 
    global a b 
    tailcall foo $a $b {*}$args 
}} 

당신은이 같은 다른, 더러운 트릭 사용할 수 있습니다 :

8.6에서는 tailcall를 사용하여 더욱 최적화 할 수 있습니다

interp alias {} foo_ab {} namespace inscope :: {foo $a $b} 

하지만 특히 빠른 아니지만, 그렇습니다 모든 Tcl 8. * 버전에서 작동합니다.

+0

변수'a'와'b'가 전역 변수가 아닌 경우'global a b '를'upvar 1 a a;로 바꿀 수 있습니다. upvar 1 b b가 proc/apply에서 그들에 접근한다. –

+0

'eval {foo $ a $ b} '에 대한 앨리어싱은 효과가 없지만 확장 수준이 더 높다. –

관련 문제