문제

나는 TCL/TK와 협력하고 있으며 최근에 자동화 응용 프로그램과 함께 TCL/TK를 사용하기 시작했으며 지식이 배고프다.

숨겨진 기능 질문의 긴 줄을 계속하려면 TCL/TK의 숨겨진 또는 편리한 기능 또는 큰 작업을 달성 할 수있는 쉬운 방법을 알고 싶습니다.

도움이 되었습니까?

해결책

Sun의 마케팅 담당자가 TCL이 "엔터프라이즈 준비"라고 선언했을 때 개발자는 다음과 같은 기능을 추가했습니다.

$ tclsh
% clock format [clock seconds] -format %Q
Stardate 63473.2

다른 팁

내가 가장 좋아하는 "숨겨진 또는 편리한 기능"은 TCL에서 인용하는 방법입니다. 나는 문구를 사용하고 싶다 "인용은 규칙이 아닌 도구입니다". 나는 또한 말하고 싶다"당신은 곱슬 교정기가 필요할 때만 곱슬 괄호 만 필요합니다."

대부분의 언어에는 특정 사물에 블록 구분 장치를 사용해야하는 규칙이 있지만 (예 : C에서는 블록을 지정하려면 {}를 사용해야합니다) TCL은 그렇게 엄격하지 않습니다.

TCL을 사용하면 인용 문자를 선택하면 필요한 효과를 줄 수 있습니다. 확실히 모범 사례가 있지만 결국에는 작업을 완료 할 수있는 인용문 캐릭터를 선택하게됩니다.

예를 들어, 다음을 포함하여 여러 가지 방법으로 절차를 정의 할 수 있습니다.

proc foo {args} {
    .... body here ....
}

proc foo "args" "
    .... body here ....
"

proc foo args [some code that returns the body]

... 등등. 조건부 진술, 루프 및 기타 모든 것도 마찬가지입니다. (처음에는 곱슬 버팀대가 쉘 단일 견적과 거의 동일하며, 이중 인용구는 쉘 이중 인용문과 같으며 정사각형 괄호는 쉘 백 티크와 같습니다.)

이제 많은 사람들이 그것을보고 WTF라고 말합니까? 그러나 그것은 실제로 프로그래머에게 많은 힘을줍니다. 우리는 종종 comp.lang.tcl에서 "내가한다면 '이 {and $ that}'라는 줄을 따라 질문을받습니다. 대답은 오래된 농담 "환자 : 의사, 내가이 의사를 할 때 아프다 : 그렇게하지 마라". 즉, 한 세트의 구분자로 얻는 행동이 마음에 들지 않으면 다른 구분기를 선택하십시오. if 문장이 일반적으로 곱슬 괄호로 구성되어 있다고해서 의미하는 것은 아닙니다. ~ 해야 하다 곱슬 버팀대로 건축됩니다.

TCL의 제가 가장 좋아하는 "숨겨진"기능입니다. 숨겨져 있지 않습니다. 놀랍도록 완전하지만 간결한 TCL (N) Man Page에 맞지만 TCL의 작동 방식을 완전히 맥주 할 때까지는 분명하지 않습니다.

인식되지 않은 명령은 인식 할 수없는 명령이 재정의 할 수있는 "알 수 없음"이라는 핸들러에 빠진다는 것입니다. 예를 들어. 알려지지 않은 명령이 평가하기위한 표현으로 취급됩니다.

$ tclsh
% 2+2
invalid command name "2+2"
% proc unknown args {uplevel 1 [linsert $args 0 expr]} 
% 2+2
4

더 많은 예제는 위키 페이지에서 찾을 수 있습니다. 급진적 인 언어 수정

tcl의 [trace] 명령을 사용하면 모든 변수를 읽고 쓸 수 있습니다. 이를 통해 변수에 대한 관찰자를 구현하고 모든 변수에 임의의 복잡성을 자동 범위 점검을 추가 할 수 있습니다 (세터/getter를 통해 변수에 액세스하는 경우). 이 기술을 사용하여 자동 증가 변수를 만들 수도 있습니다.

proc varlimit_re {re var key op} {
  upvar $var v
  if { [regexp -- $re $v] <= 0 } {
    error "$var out of range"
  }
}

trace add variable ::myvar {write} [list varlimit_re {^[A-H]\d{3}-[0-9a-f]+$}]`

정규 표현식과 일치하지 않는 것으로 'Myvar'를 설정하려고하면 런타임 오류가 발생합니다.

숨겨져 있지 않지만 다른 언어에서 오는 사람들에게 명확하지 않은 경향이있는 편리한 기능은 자신의 제어 구조를 정의하거나 위험하게 살고 싶다면 기존 구조를 재정의 할 수 있다는 것입니다. 예제가 있습니다 TCL 위키

TCL은 간단하고 개방적인 언어입니다. 숨겨진 기능은 거의 없습니다. 프로그래머가 확장하고 적응하기 위해 모두 노출되었습니다.

TCL의 "키워드"는 모두 [for], [foreach], [while] 등과 같은 제어 구조를 포함한 일반 TCL 명령입니다. 이는 순수한 TCL 코드로 새로운 제어 구조를 작성하여 언어를 확장 할 수 있음을 의미합니다.

예를 들어, 시도/온/트랩 TCL 코드 만 사용하여 TCL 8.6A에서 구조가 구현되었습니다. 마찬가지로 tcllib에는 제어 :: do, do/while 컨트롤 구조가 포함됩니다.

이 중 많은 부분이 [upvar] 및 [upvel] 명령을 통해 가능해 지므로 다른 스택 프레임에서 변수에 액세스하거나 코드를 실행할 수 있습니다.

IMHO TCL의 가장 큰 숨겨진 특징은 그것입니다 C API. 이를 사용하면 Core C 프로그램 또는 서브 시스템을 래핑하고 TCL에 GUI 또는 기타 기능을 작성하는 것이 정말 쉽습니다. 이 기능은 TCL에 고유하지 않지만 TCL은 처음부터이를 수행하도록 설계되었으며 C API는 특히 작업하기가 쉽습니다.

두 번째로 큰 숨겨진 기능은입니다 포장 기계, 모든 기하학 관리자의 그랜드-다디. 이를 통해 GUI는 놀랍도록 적은 양의 코드로 상당한 창을 가질 수 있습니다. .NET이 나오기 최소 10 년 전에 TCL/TK가 지오메트리 관리를 받았다는 점에 유의해야합니다.

TCL의 세 번째로 큰 특징은 C API를 통해 또는 TCL에 정의 된 명령을 사용하여 언어를 빠져 나가는 능력입니다. 그럼에도 불구하고 LISP 매크로는 아니지만 그럼에도 불구하고 상당히 유연합니다. 예상하다 도메인 별 스크립팅 언어를 만들기 위해 BASSE TCL 언어를 확장하는 응용 프로그램의 아주 좋은 예입니다.

편집하다: 글쎄, 버거 나, xt 실제로 기하학 관리자가있었습니다, 나는 그것이 팩보다 다소 고통 스럽다는 점에서 Nat에 동의하지만;-}

  1. [array names] 초보자가 배열을 반복하는 방법에 대해 묻는 첫 번째 질문 중 하나입니다.
  2. 또한, 당신이 할 수 있다는 사실 foreach {key1 key2} {$list1 $list2} {...} - 목록의 크기가 다르더라도
  3. 스위치 케이스간에 댓글을 사용해서는 안됩니다 (이것은 멋진 기능은 아니지만 대부분의 개발자가 이해하지 못하는 문제입니다.
  4. 그만큼 rename 명령은 모든 함수/Proc의 이름을 바꿀 수 있습니다

제 생각에는 시각 명령은 훌륭합니다. 정확히 숨겨져 있지는 않지만 Comp.Lang.tcl에서 사람들이 "어떤 기능이 더 빠른"묻는 것을 막지는 않습니다.

"얼마나 오래 걸리나요?"를 알고 싶을 때마다 또는 "어떤 방법이 더 빠르나요?" "시간"명령을 통해 호출합니다. 객체 만들기, 수학, 오버 헤드, 예외적으로 간단하지 않습니다. 다른 언어는 비슷한 기능을 가지고 있지만 일부는 약간 우아합니다.

잘 문서화 된 C API는 또한 Perl에서 쉽게 통합 할 수있었습니다. TCL/TK에 대한 나의 경험은 1995 년으로 거슬러 올라가지 만 2000 년경에 Perl/TK를 발견하고 결코 뒤돌아 보지 않았습니다.

그리고 최근에 TCL 및 TKX Perl 패키지는 우리에게 현대적인 GUI를 제공합니다. 그리고 앞서 언급 한 두 모듈은 사소한 모듈이지만 언어 경계에서 수행 할 수있는 일을 고려하여 비교적 적은 코드를 포함합니다. 그리고 그것은 우수한 API (및 Perl의 힘)에 직접적으로 기인 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top