2013-06-12 3 views

답변

8

처음 몇 가지 기본 사항. Tcl에는 참조가 없습니다. 무엇이든. 따라서 tcl의 모든 명령은 항상 값을 반환합니다.

첫 번째 질문에 대한 간단한 대답은 값을 반환한다는 것입니다.

tcl의 가치 의미론이 어떻게 작동하는지에 대해 자세히 알아 보려면 두 가지 방법이 있습니다.

처음에는 언어 사양에서 나온 언어가 있습니다. 즉, 사용자/프로그래머의 관점. 이 관점에서 보면 tcl은 프로세스 문자열이라는 한 가지 작업 만 수행 할 수 있습니다. tcl의 모든 것은 문자열입니다. 좀더 기술적으로 tcl은 극도로 강력한 가치 의미론을 가지고 있고 어떤 참조 의미론도 거의 없다는 것을 제외하고는 (C는 숫자를 선호한다는 것을 제외하고는 C와 같은 종류의 문자열을 의미합니다).

그렇다면 목록은 무엇입니까? 글쎄,이 관점에서, 목록은 특별히 형식이 지정된 문자열 이상입니다. 문자열이 목록처럼 보이면 목록입니다. 그렇지 않은 경우 잘못된 목록입니다. 두 경우 모두 두 줄입니다. 숫자에 관해서도 마찬가지입니다.

그렇다면 배열은 무엇입니까? 자, 배열은 약간 특별합니다. 같은 방식으로 파일은 특별하고 URL은 특별합니다. 파일의 값 (내용)을 얻으려면 openreadgets과 같은 명령을 사용하십시오. 배열의 값을 얻으려면 array get과 같은 명령과 특수한 $array_name(key) 구문을 사용합니다. 배열을 일종의 내장 된 간단한 키 - 값 쌍 데이터베이스로 생각할 수 있습니다. $array_name은 배열의 값 (내용)의 문자열 표현 대신 구문 오류를 생성하기 때문에 tcl에서 일반 변수처럼 작동하지 않습니다. 그러나 array get은 배열을 문자열 표현으로 다시 직렬화 할 수 있으므로 모든 문자열이 모든 관점에서 다시 잘 나타납니다.

두 번째 관점은 언어가 구현되는 방식입니다. C 레벨에서 tcl의 모든 것은 객체이고 변수/값은 항상 포인터로 전달됩니다. Tcl은 가능한 한 빨리 액세스하고 수정할 수있는 형식으로 데이터를 저장하기 위해 많은 노력을 기울이고 있습니다. 따라서 상위 레벨 뷰는 문자열 형식 규칙에 불과하지만 낮은 레벨에서는 실제로 문자열과 다르게 구현됩니다. 이렇게하면 tcl이 목록과 배열 및 숫자를 빠르게 처리 할 수 ​​있습니다. 그러나 목록이나 배열 또는 숫자를 문자열로 처리하도록 tcl에게 명시 적으로 요청하면 tcl은 객체를 문자열로 구문 분석 한 다음 나중에 해당 문자열을 원시 객체 유형으로 다시 구문 분석합니다. 이것은 반짝임으로 알려져 있으며 많은 CPU 사이클을 소모합니다.

Tcl은 또한 후드에서 수정시 쓰기를 구현합니다. 따라서 목록이나 문자열의 전체 복사본을 반환해도 실제로 개체의 다른 복사본이 메모리에 만들어지지 않습니다. 복사본은 반환 값을 수정하려고하는 경우에만 만들어집니다.

두 번째 질문에 대한 답은 속도 (regexp, string first 등)에 신경 쓰면 문자열 명령으로 목록 배열을 처리하지 않는 것입니다. 목록 명령을 사용하여 목록을 처리하고 문자열 명령을 처리하여 문자열을 처리합니다. 당신이 그것을 피할 수없는 경우가 있는데, 문자열 명령이 더 쉽고 속도가 중요하지 않지만 일반적으로 반짝이는 것을 피하려고하는 경우가 있습니다. 습득하는 습관이 좋습니다.

위와 같이 목록을 수정하는 가장 효율적인 방법은 배열에서 목록 명령 (lset, lrange 등)을 사용하는 것입니다.예를 들어 배열 "foo"의 "bar"목록에서 두 번째 요소를 수정하려면 다음을 수행하십시오.

lset foo(bar) 1 "new value" 
+0

감사합니다. 나보다 훨씬 더 많은 사람들에게 도움이 될 것입니다. – Dronacharya

+0

다음과 같은 작은 스크립트를 작성했습니다 :'array set ma [list f] first [s] [list "sec" "ond"]] puts ma (f) ma (s)'를 실행하면'ma (f) ma (s) '가 인쇄됩니다. 내가 뭘 잘못하고있어, 나에게 말해 줄 수 있니? – Dronacharya

+0

엄밀히 말하면, Tcl에는 *** 불변의 *** 참조 의미가 있습니다 (참조 루프가 없음이 보장됨). Tcl 코드의 관점에서 보면, 더 빠르다는 것을 제외하고는 값 의미와 같습니다. –

관련 문제