특정 이름공간(Namespace)에 속하는 Tcl 커맨드 만들기

admin의 아바타

특정 이름공간(namespace)에 속하는 커맨드를 만드는 방법은 매우 간단합니다. Tcl_CreateCommandTcl_CreateObjCommand 로 추가 하고 싶은 커맨드의 이름앞에 ::이름공간::이름공간... 라고 붙이면 됩니다.

DLLEXPORT int Abc_Init(Tcl_Interp* interp){
        if(Tcl_CreateObjCommand(interp, "::samplens::sample",
                sampleObjCmd, NULL, NULL) == TCL_ERROR) return TCL_ERROR;
        return TCL_OK;
}

이것만으로는 다른 이름공간에서 커맨드를 바로 사용 할수 없기 때문에, 커맨드를 호출시에 항상 이름공간을 커맨드 앞에 붙여야합니다. 그렇다면 namespace export를 하는 Tcl API 가 있지 않을까 하는 생각에 찾아 보니 Tcl_Export 라고 하는 API를 찾을수 있었습니다. 하지만, 정식 API에는 공개 되어 있지 않은것 같아 사용은 하지 않고 다른 방법을 모색해봤습니다. 위와 같은 API를 통한 방법 말고도 다른 방법이 있는데, 바로 Tcl의 스크립트를 Tcl_Eval로 사용하여, export 시키는 기능을 구현하는 것입니다.

DLLEXPORT int Abc_Init(Tcl_Interp* interp){
        if(Tcl_CreateObjCommand(interp, "::samplens::sample",
                sampleObjCmd, NULL, NULL) == TCL_ERROR) return TCL_ERROR;
        char cmd[] = "namespace eval samplens { namespace export * }";
        if(Tcl_Eval(interp, cmd) == TCL_ERROR) return TCL_ERROR;
        return TCL_OK;
}

회피하는 방법 같긴 하지만, 결과는 같습니다.