2014-11-27 3 views
1

Tcl 스크립트에서 일부 최종 작업을 실행하기 위해 Tcl proc의 복귀를 확인하고 싶습니다. 예상대로 교체 info body X10return [expr $a * 10]와 작동하지만 invalid command name " return [expr $a * 10] "Tcl 스크립트 : proc 본문을 실행할 때 잘못된 명령 이름이 반환됩니다.

:

proc X10 { a } { return [expr $a * 10] } 
proc procF {} { 
    set a 13 
    catch {[info body X10]} __result 
    return $__result 
} 
procF 

앞의 코드는 나에게 오류를 제공 다음과 같이 예를 들어 내 코드가 될 수 있습니다. 처음에 생각한 것은 둘 다 교환 가능하고 동일한 출력을 제공해야한다는 것입니다. 첫 번째 오류가 발생하는 이유와 두 가지 오류의 차이점은 무엇입니까?

+0

코드가 더 빨라지고 함정이 줄어들지 않게하려면, 표현식 주위에 중괄호로 'X10'을 정의하십시오 :'proc X1 {a} {return [expr {$ a * 10}]}' Tcl로 바이트 코드를 컴파일하면'X1 {[puts haha; exit]}'... –

+0

그게 좋은 지적입니다. 나는 왜 가이드와 중괄호로 표현을 묶는 것이 더 나은지에 대해 스스로에게 묻곤했습니다. 그리고 그것은 단지 일종의 가독성이라고 생각했습니다. 그러나 "바이트 코드 컴파일"의 일부를 얻지 못했습니다. 더 자세히 설명하거나 일종의 참조 또는 링크를 참조 할 수 있다면 고맙겠습니다. – Devos

+0

당신이 무엇을 하든지,'procF'는 문자열 "__result"를 리턴합니다. 호출을'return $ __ result' 또는 동일하게'set __result'라고 원할 수도 있습니다. –

답변

1

X10의 본문을 가져 와서 해당 코드를 명령 이름으로 처리하기 때문에 코드가 작동하지 않습니다. Tcl은 당신을 위해 자동으로 물건을 나눠 먹지 않습니다. 당신은 이어야합니다.을 물어보십시오. 이것은 중요한 언어 안전 요소입니다. 실제로 귀하의 경우 경사 될 것

proc procF {} { 
    set a 13 
    catch [info body X10] __result 
    return __result 
} 

그러나 (로 : 당신은 다음과 같이해야 할 것 :이 (catch에 첫 번째 인수가 스크립트이기 때문에)

proc procF {} { 
    set a 13 
    catch {eval [info body X10]} __result 
    return __result 
} 

또는 정확히 제시 및 수행) 당신이 말한 내용을 해석하려고 :

proc procF {} { 
    set a 13 
    catch {X10 $a} __result 
    return __result 
} 

참고 또한이 그랬다면 :

을3210
proc procF {} { 
    set a 13 
    catch {info body X10} __result 
    return __result 
} 

그러면 결과는 평가되지 않고 X10의 정의가됩니다.

+1

답변 해 주셔서 감사합니다. 1. 왜 괄호로 몸을 감싸는 것이 명령을 평가하지 않는지; 나는 'catch'명령을 사용하지 않고 그것을 사용했고 효과가 있었다. 2.'catch [info body X10]'에서 여러 문을 중괄호없이 어떻게 해석 할 수 있습니까? 3. 캐치 {X10 $ a}을 사용하면 필요없는 추가 호출을 추가 할 수는 없지만 upvar에 의해 반박 될 수는 있습니다. – Devos