Programming/TclTk

TCL 스크립트 라이브러리

Hunveloper 2022. 9. 6. 16:23
728x90

스크립트 라이브러리

  • 라이브러리는 유용한 프로시져들을 묶어서 다른 응용 프로그램에서 사용할 수 있게 함
  • 큰 프로그램을 만들때에는 간단한 메인을 작성하고 기타 함수는 라이브러리로 생성
  • 작은 단위로 쪼개면 필요할 때만 메모리에 탐재되기에 수행 효율 향상 가능
  • TCL프로그램을 작성할 때에는 코드 변환에 주의해야 함
  • TCL은 형식화된 모듈 시스템이 없기에 다른 패키지에서 프로시져와 전역 변수 충돌을 막기 위한 코드 변환이 필요

unknown 명령

  • TCL 라이브러리 기능은 unknown 명령에 의해 사용가능
  • TCL 해석기가 해석할 수 없는 명령을 만나는 경우 그 명령을 인자로 하여 unknown 명령을 호출
  • unknown 명령은 TCL로 구현되어 있기에 해석 불가능한 명령을 해석하는 새로운 unknown 명령을 생성
  • 여기에서는 init.tcl 파일에 기본적으로 구현되어 있는 unknown 명령의 동작을 설명
  • 라이브러리 위치는 info library 명령을 이용해 조회
  • 라이브러리 기능을 사용하기 위해 tclsh나 wish는 처음에 시작될 때 다음의 명령을 수행
source [info library]/init.tcl

tclIndex 파일

  • unknown 명령은 존재하지 않는 명령을 빨리 찾기 위해 인덱스를 사용
  • 스크립트 라이브러리를 생성한 후에는 라이브러리에 어떤 프로시져가 등록되어 있는지를 기록한 인덱스를 생성해야 함
  • auto_mkindex 프로시져는 인덱스를 생성하고 tclIndex라는 파일에 그 내용을 기록
  • 만약 모든 예제가 /usr/local/tcl/examples/라는 디렉토리 밑에 있다면 다음 명령을 수행해 인덱스를 생성
auto_mkindex /usr/local/tcl/examples *.tcl
  • 이 프로시져는 인덱스 파일을 처음부터 다시 생성
proc Library_UpdateIndex {libdir} {
    if ![file exists $libdir/tclIndex] {
        set doit 1
    } else {
        set age [file mtime $libdir/tclIndex]
        set doit 0
        # Changes to directory may mean files were deleted
        if {[file mtime $libdir] > $age} {
            set doit 1
        } else {
            # Check each file for modification
            foreach file [glob $libdir/*.tcl] {
                if {[file mtime $file] > $age} {
                    set doit 1
                    break
                }
            }
        }
    }
    if {$doit} {
        auto_mkindex $libdir *.tcl
    }
}

라이브러리 사용하기 : auto_path

  • 스크립트 라이브러리를 사용하기 위해서는 unknown 명령에게 어디를 찾아볼지 설정해야 함
  • unknown 명령은 찾을 디렉토리를 quto_path라는 변수에 저장
  • auto_noloca 명령은 unknown 명령 메커니즘을 취소

자동 로드

  • tclIndex 파일을 살펴 보면 auto_index라는 배열이 정의된 것을 알 수 있음
  • 각 배열의 한 원소는 스크립트 라이브러리를 정의
  • tclIndex 파일의 줄을 살펴보면 다음과 같음
set auto_index(Bind_Interface) "source $dir/bind_ui.tcl"
  • tclIndex 파일을 읽을 때 $dir은 tclIndex 파일을 포함하는 디렉토리 이름으로 대체
728x90
728x90