2012-04-11 3 views
2

내가 원하는 것은 tcl proc에 대한 인수를 평가없이 문자열로 구문 분석하는 것입니다.평가되지 않은 tcl 인수 얻기

test [list [expr 1+1] [expr 2+2]] 

그리고하지 않은 TCL [list [expr 1+1] [expr 2+2]]을 평가 :

proc test { args } { 
    puts "the args are $args" 
} 

는 내가 뭘하려는 것은 그것을 호출입니다 : 예를 들어 난 그냥 그것의 인수를 출력 사소한 시저가 있다면. 또는 심지어 을 평가하더라도 원래 명령 줄을 갖고 싶습니다. 따라서 사소한 "테스트"와 나는 위의 시저 반환 할 수 싶습니다

the args are [list [expr 1+1] [expr 2+2]]

는 TCL 8.4이 가능합니까?

답변

3

당신 은 Tcl 8.4 (및 이전에이 작업을 수행 할 수); 언어 디자인은 이것을 불가능하게 만듭니다. 해결 방법은 평가되지 않은 인수를 중괄호로 묶어 전달하는 것입니다. 그런 다음 원하는대로 인쇄 할 수 있습니다. 평가 된 양식을 얻으려면 절차 내에서이 작업을 수행해야합니다.

set evaluated_x [uplevel 1 [list subst $unevaluated_x]] 

좀 이상하다.


당신은 Tcl 8.5을 사용한 경우, 다른 대안이있을 것이다 :

set calling_code [dict get [info frame -1] cmd] 
info frame -1은 현재 프로 시저를 호출 한 상황에서 현재 명령에 대한 설명을 들고 사전을 가져옵니다

하고, 그 cmd 키는 대체 규칙이 적용되기 전에 실제 명령 문자열입니다. 그게 네가 원하는 것에 관한 것이어야한다.

8.4에는 사용할 수 없으며 으로 역 백화되지 않습니다. 업그레이드하고 싶을 수도 있습니다!

+0

감사합니다. 이것이 내가 두려워했던 것입니다. – user1327792

+0

'정보 프레임'이 8.4로 결코 역전되지 않을 것이라는 이유는 구현하기에 상당히 많은 침입 기계가 필요하다는 것입니다. 이미 매우 복잡한 영역에서 Tcl의 구현에는 많은 복잡성이 추가되었습니다. 백 포트가 크게 파괴적 일 것입니다. –

1

테스트, enclose them in braces 예에 인수를 전달할 때 : 테스트 {[목록 [expr에 1 + 1] [expr에 2 + 2]]}

+0

감사합니다. 그러나 인수 목록이 나에게 전달되었다는 것을 잊었고 arg를 편집하여 중괄호를 추가 할 수 없습니다. – user1327792