Как составить список всех пространств имен в экземпляре TCL?

Как составить список всех пространств имен, загруженных в экземпляр tclsh?

Ченц


person Crazy Chenz    schedule 31.05.2012    source источник


Ответы (1)


Попробуйте запустить этот процесс из Wiki TCLer.

    proc listns {{parentns ::}} {
        set result [list]
        foreach ns [namespace children $parentns] {
                eval lappend result [listns $ns]
                lappend result $ns
        }
        return $result
    }

Когда я запускаю его, я получаю следующий вывод:

% listns
::platform ::activestate::teapot::link ::activestate::teapot ::activestate ::tcl
::clock ::tcl::info ::tcl::dict ::tcl::tm ::tcl::mathop ::tcl::unsupported ::tcl
::mathfunc ::tcl::chan ::tcl::string ::tcl
%

Итак, чтобы получить ВСЕ пространства имен, вам просто нужно сделать это:

set all_namespaces [concat [listns] "::"]
person TrojanName    schedule 31.05.2012
comment
@schlenk Не совсем; обход всего дерева не очень хорош, когда дело доходит до оптимизации хвостового вызова. lappend result {*}[listns $ns] $ns было бы улучшением (для этого требуется только широко распространенная версия 8.5). - person Donal Fellows; 01.06.2012
comment
он не перечисляет :: ... он также перечисляет только дочерние элементы ::, есть ли какие-либо другие пространства имен, не относящиеся к ::? - person Crazy Chenz; 01.06.2012
comment
@CrazyChenz :: — это корневое пространство имен. Разве это не ответ на ваш вопрос? - person TrojanName; 01.06.2012
comment
Я отредактировал вопрос, чтобы показать, как использовать процедуру для поиска ВСЕХ пространств имен. Дайте мне знать, если вам нужна дополнительная информация. - person TrojanName; 01.06.2012