2013-07-31 3 views
1

Есть ли способ (вызов метода), чтобы узнать имя текущего пакета в tcl ??__PACKAGE__ эквивалент в tcl

Например:

package provides abc 

proc A { 

// I need to print the package name abc. 

} 

Я знаю имя класса здесь, очевидно, «ABC», но все же я хочу, чтобы распечатать его с помощью команды TCL. Я работаю над некоторыми модулями отладки и, следовательно, нуждаюсь в этом. (Подобно тому, что обеспечивает Perl: __ ПАКЕТ __)

+0

No. Вы можете предоставить несколько различных пакетов в одном файле. 'info script',' info level' и 'info frame' могут помочь, но они не предоставляют имя пакета. –

ответ

1

Я не знаю ничего подобного. Однако вы можете обойтись:

set __PACKAGE__ foo 
package provide $__PACKAGE__ 1.0 
# Use can use the variable $__PACKAGE__ from now on 
+0

Спасибо за ваш ответ. Но будет ли это работать, если мне нужно сделать это в нескольких пакетах? Из того, что я знаю, переменные tcl являются глобальными или локальными для процедуры. – sundar

+1

@sundar Обычно (но не обязательно) класть вещи, определенные пакетами в пространстве имен с тем же именем (по модулю ведущий '::'); переменные и команды всегда являются локальными для пространства имен, и существует 'namespace current'. –

+0

@sundar: Это не работает: __PACKAGE__ только глобальная переменная, которая будет переопределена следующим пакетом. –

0

Вам не хватает нескольких частей головоломки. Несмотря на то, что вы объявили proc A в файле, который является частью пакета, A по-прежнему создается глобально.

Команда package действительно просто помогает tcl определить, какой файл для источника. Обычно вы хотите смешать package provide с namespace

package provide abc 

namespace eval ::abc { 
    proc A {} {puts stdout "I am in namespace [namespace current]"} 
    proc B {} {..} 
    proc C {} {..} 
} 

Для того, чтобы вызвать эту функцию вы могли бы сказать

::abc::A 

внутри тела A вы можете сказать, что пространство имен вы в систему с помощью namespace current

Альтернативный способ записи будет

namespace eval ::abc {} 
proc ::abc::A {} {puts stdout "I am in namespace [namespace current]"} 
proc ::abc::B {} {..} 
proc ::abc::C {} {..} 

Между пакетами и пространствами имен не существует сопоставления между собой. Таким образом, один пакет может создать много пространств имен (или как в вашем примере, без пространств имен).

Заканчивать эту страницу для того, как создавать библиотеки: http://www.tcl.tk/man/tcl8.5/tutorial/Tcl31.html

И эту страницу для получения полной инструкции по package и namespace http://www.tcl.tk/man/tcl8.6/TclCmd/contents.htm

Смежные вопросы