info — Tcl 인터프리터 상태 조회
info — Tcl 인터프리터 상태 조회
프로시저의 인자 목록이나 몸통을 알고 싶거나, 지금 어떤 변수·명령어가 정의돼 있는지 살펴보고 싶을 때가 있어요. info 명령어가 인터프리터 내부 상태에 대한 정보를 제공해요.
본문
시그니처
info option ?arg arg ...?
info는 Tcl 인터프리터의 다양한 내부 정보를 제공해요. 옵션(축약 가능)은 다음과 같아요.
기본 정보 옵션
-
info args procname— 프로시저procname의 인자 이름들을 순서대로 담은 리스트 반환.procname은 Tcl 명령어 프로시저의 이름이어야 해요. -
info body procname— 프로시저procname의 몸통 반환. -
info class subcommand class ?arg ...—class클래스에 대한 정보 반환. 하위 명령어는 아래 CLASS INTROSPECTION 참고. -
info cmdcount— 이 인터프리터에서 호출된 명령어의 총 수 반환. -
info commands ?pattern?—pattern을 지정하지 않으면 현재 네임스페이스에 보이는(한정 이름 없이 실행 가능한) 모든 Tcl 명령어 이름의 리스트 반환(C로 작성된 내장 명령어와proc으로 정의된 명령어 프로시저 포함).pattern을 지정하면 그에 매칭되는 이름만 반환해요. 매칭 규칙은string match와 같아요.Foo::print*같은 한정 이름도 가능하고, 네임스페이스를 지정하면 그 네임스페이스에 정의된 명령어만 한정 이름으로 반환해요. -
info complete command—command가 완전한 Tcl 명령어인지(닫히지 않은 따옴표·중괄호·대괄호·배열 요소 이름이 없음)를 나타내는 1 또는 0 반환. 줄 단위 입력 환경에서 여러 줄에 걸친 명령어를 받을 때 주로 써요 — 명령어가 완전하지 않으면 완성될 때까지 평가를 미루면 돼요. -
info coroutine— 현재 실행 중인 코루틴의 이름 반환. 실행 중인 코루틴이 없거나, 현재 코루틴이 삭제됐지만 아직 반환·양보하지 않았다면 빈 문자열. -
info default procname arg varname—arg가 기본값이 없으면 0, 있으면 1을 반환하고 그 기본값을varname변수에 넣어요. -
info errorstack ?interp?— 마지막 오류의 호출 스택 각 단계에서 함수 이름과 인자들을 프로그램적으로 파싱하기 쉬운 형태로 반환. 짝수 크기 리스트로 토큰과 파라미터가 번갈아 나와요. 토큰은 현재CALL,UP,INNER.CALL은 프로시저 호출(파라미터는 해당info level 0),UP는uplevel등이 만든 변수 프레임 이동(이전 CALL 항목에 적용, 파라미터는 레벨 오프셋),INNER는 오류를 일으킨 가장 안쪽 원자 명령어·바이트코드 명령어를 식별해요. 이 정보는 3-인자catch가 반환하는 옵션 딕셔너리의-errorstack항목에도 있어요. -
info exists varName— 현재 컨텍스트에서 변수varName이 존재하고 값이 부여됐으면 1, 아니면 0. -
info frame ?number?—info level이 숨기는 프레임까지 포함해 스택의 모든 프레임 접근.number를 지정하지 않으면 현재 명령어의 프레임 레벨(최상위에서 호출되면 1) 반환. 지정하면 그 번호 레벨 명령어의 위치 정보를 담은 딕셔너리 반환. 양수는 특정 스택 레벨 선택(1은 가장 바깥 활성 명령어), 음수는 현재 명령어 기준 상대 레벨(0은info frame자신). 결과 딕셔너리 키:type— 항상 존재.source(source로 로드된 스크립트),proc(동적 생성 프로시저 몸통),eval(eval·uplevel로 실행),precompiled(tbcload 패키지의 사전 컴파일 스크립트).line— 명령어가 속한 스크립트 안의 줄 번호.precompiled엔 없고,source는 파일 시작 기준, 나머지는 스크립트 시작 기준.file—source타입에서만 존재. 파일의 정규화된 경로.cmd— 명령어의 문자열 표현. 보통 치환 전 형태지만eval로 실행된 정식 목록은 치환된 형태.proc— 일반 Tcl 프로시저 몸통 안일 때만 존재. 그 프로시저 이름.lambda— 익명 프로시저(lambda) 몸통 안일 때만 존재. 해당 lambda 전체 정의.level— 조회한 프레임에info level이 반환하는 대응 프레임이 있을 때만 존재. 현재 레벨 기준 인덱스.
파일에 정적으로 정의된 프로시저의 몸통 명령어 위치는
proc타입이 아니라source타입·절대 줄 번호로 보고돼요. 동적 환경에서의 프로시저 정의와 eval은 스크립트 시작 기준으로 줄 수를 세요.{*}구문은eval처럼 처리돼요. -
info functions ?pattern?—pattern을 지정하지 않으면 현재 정의된 모든 수학 함수의 리스트 반환. 지정하면 이름이 매칭되는 함수만. -
info globals ?pattern?— 현재 정의된 전역 변수(::네임스페이스의 변수) 이름들 반환.pattern필터 가능. -
info hostname— 이 호출이 실행 중인 컴퓨터의 이름 반환. 정규화된 도메인 이름을 보장하지는 않고, TCP/IP 네트워킹에 적합한 이름을 반환해요. -
info level ?number?—number를 지정하지 않으면 호출 프로시저의 스택 레벨(최상위면 0) 반환. 지정하면 그 레벨 프로시저 호출의 이름과 인자 리스트 반환. 양수는 특정 레벨(1=가장 바깥 활성 프로시저), 음수는 현재 기준 상대(0=현재,-1=호출자). 스택 레벨 의미는uplevel참고. -
info library— 표준 Tcl 스크립트가 저장된 라이브러리 디렉토리 이름 반환.tcl_library변수의 값으로tcl_library를 설정해 바꿀 수 있어요. -
info loaded ?interp?—load명령어로interp에 로드된 모든 패키지를 설명하는 리스트 반환. 각 요소는 파일 이름과 패키지 이름의 두 요소 하위 리스트. 정적으로 로드된 패키지의 파일 이름은 빈 문자열.interp를 생략하면 프로세스 내 모든 인터프리터에 로드된 패키지 정보. 현재 인터프리터만 보려면interp인자에 빈 문자열 지정. -
info locals ?pattern?— 현재 정의된 로컬 변수 이름들 반환(현재 프로시저 인자 포함).global,upvar,variable로 정의된 변수는 제외.pattern필터 가능. -
info nameofexecutable— 애플리케이션이 호출된 바이너리 파일의 전체 경로 반환. 식별할 수 없으면 빈 문자열. -
info object subcommand object ?arg ...—object객체에 대한 정보 반환. 아래 OBJECT INTROSPECTION 참고. -
info patchlevel— Tcl 라이브러리 정확한 버전을 담는 전역 변수tcl_patchLevel의 값 반환. -
info procs ?pattern?— 현재 네임스페이스의 Tcl 명령어 프로시저 이름들 반환.pattern필터 가능. 패턴에 네임스페이스 구분자가 있으면 그 네임스페이스(또는::로 시작하면 전역)를 기준으로 매칭. -
info script ?filename?— 현재 Tcl 스크립트 파일이 평가 중이면(Tcl_EvalFile 호출이나source명령어 활성) 처리 중인 가장 안쪽 파일 이름 반환.filename을 지정하면 활성 호출 동안 그 이름을 반환하도록 수정(가상 파일 시스템 앱에서 유용). 아니면 빈 문자열. -
info sharedlibextension— 이 플랫폼에서 공유 라이브러리 파일 이름에 쓰는 확장자(예: Solaris의.so) 반환. 공유 라이브러리를 지원하지 않으면 빈 문자열. -
info tclversion— Tcl 라이브러리의 주·부 버전을 담는 전역 변수tcl_version의 값 반환. -
info vars ?pattern?— 현재 보이는 변수 이름들 반환(로컬과 현재 보이는 전역 포함).pattern필터 가능, 한정 이름도 지원. 아직 설정되지 않은(선언만 된) 변수는 '존재'하지 않을 수 있다는 점에 주의.
클래스 인트로스펙션 (CLASS INTROSPECTION)
info class가 지원하는 하위 명령어:
info class call class method—class의method구현을 제공하는 메서드 구현들 설명 반환. 각 항목이 네 요소([일반 타입, 호출된 메서드 이름, 정의한 클래스의 정규화 이름, 구현 타입])인 리스트의 리스트.info class constructor class—class의 생성자 정의 설명 반환. 두 요소 리스트(첫 요소는proc·메서드 정의에 넘기기 적합한 인자 목록, 둘째는 본문). 생성자가 없으면 빈 리스트.info class definition class method—class의method메서드 정의 설명 반환(구조는 constructor와 동일).info class destructor class— 소멸자 본문 반환. 없으면 빈 문자열.info class filters class— 클래스에 설정된 필터 메서드 리스트 반환.info class forward class method—class에 설정된 메서드 포워딩method의 인자 목록 반환.info class instances class ?pattern?—class의 인스턴스 리스트 반환.pattern으로 제한 가능.info class methods class ?options...?—class의 공개(exported) 메서드 리스트 반환.-all은 수퍼클래스·믹스인의 메서드 포함,-private는 비공개 메서드 추가 포함.info class methodtype class method—method의 구현 타입 설명 반환.method면info class definition,forward면info class forward로 추가 정보 확인.info class mixins class—class에 믹스인된 모든 클래스 리스트 반환.info class subclasses class ?pattern?— 직접 서브클래스 리스트 반환.pattern필터 가능.info class superclasses class— 상속 우선순위 순서의 직접 수퍼클래스 리스트 반환.info class variables class—class에 선언된 모든 변수(메서드·생성자·소멸자에 자동 존재) 리스트 반환.
객체 인트로스펙션 (OBJECT INTROSPECTION)
info object가 지원하는 하위 명령어:
info object call object method—object의method구현을 제공하는 메서드 구현들 설명 반환(형식은 class call과 유사하되 정의 주체가 클래스 정규화 이름 또는 리터럴object).info object class object ?className?—className을 지정하지 않으면 객체의 클래스 반환. 지정하면 객체가 그 클래스인지 불리언 반환.info object definition object method—object의method메서드 정의 설명 반환.info object filters object— 객체에 설정된 필터 메서드 리스트 반환.info object forward object method— 객체에 설정된 메서드 포워딩method의 인자 목록 반환.info object isa category object ?arg?— 객체가 특정 범주에 속하는지 불리언 반환. 범주:class(oo::class 인스턴스인지),metaclass(클래스를 만들 수 있는 클래스인지),mixin(클래스가 직접 믹스인됐는지),object(진짜 객체인지),typeof(class가 객체의 타입인지 — 직간접 인스턴스).info object methods object ?option...?— 객체의 공개 메서드 리스트 반환.-all은 클래스·믹스인·수퍼클래스 메서드 포함,-private는 비공개 추가.info object methodtype object method—method의 구현 타입 설명 반환.info object mixins object— 객체에 믹스인된 모든 클래스 리스트 반환.info object namespace object— 객체의 내부 네임스페이스 이름 반환.info object variables object— 객체에 선언된 모든 변수(메서드에 자동 존재) 리스트 반환.info object vars object ?pattern?— 객체의 비공개 네임스페이스의 모든 변수 리스트 반환.pattern필터 가능.info object variables와 달리 현재 설정되지 않은 변수나 메서드가 자동 포함하지 않는 변수도 포함할 수 있어요.
예제
Tcl 스크립트에 저장하기 적합한 프로시저를 출력하는 명령어:
proc printProc {procName} {
set result [list proc $procName]
set formals {}
foreach var [info args $procName] {
if {[info default $procName $var def]} {
lappend formals [list $var $def]
} else {
# Still need the list-quoting because variable
# names may properly contain spaces.
lappend formals [list $var]
}
}
puts [lappend result $formals [info body $procName]]
}
객체 예제 — 모든 객체는 자신의 클래스를 알며 인트로스펙션으로 쉽게 꺼낼 수 있어요:
oo::class create c
c create o
puts [info object class o]
→ prints "::c"
puts [info object class c]
→ prints "::oo::class"
어떤 클래스가 메서드를 구현하는지, 어떻게 정의됐는지 알아내는 인트로스펙션:
proc getDef {obj method} {
foreach inf [info object call $obj $method] {
lassign $inf calltype name locus methodtype
# Assume no forwards or filters, and hence no $calltype
# or $methodtype checks...
if {$locus eq "object"} {
return [info object definition $obj $name]
} else {
return [info class definition $locus $name]
}
}
error "no definition for $method"
}
단일 상속만 가정하고 상속 트리를 직접 따라 올라가며 정의를 찾는 대체 방법:
proc getDef {obj method} {
if {$method in [info object methods $obj]} {
# Assume no forwards
return [info object definition $obj $method]
}
set cls [info object class $obj]
while {$method ni [info class methods $cls]} {
# Assume the simple case
set cls [lindex [info class superclass $cls] 0]
if {$cls eq ""} {
error "no definition for $method"
}
}
# Assume no forwards
return [info class definition $cls $method]
}