2013-09-12 6 views
0

Я хочу знать, в каком пакете будут доступны все команды tcl. например, строка, список и т. Д.TCL: какой пакет по умолчанию для команд tcl

Когда мы хотим использовать expect, мы будем использовать пакет Expect, аналогично мы используем эти команды (string, list и т. Д.) Без импорта какого-либо пакета. Я хочу знать, в каком пакете все это принадлежит?

В основном я пришел из java ... В java "java.lang" пакет по умолчанию.

+0

В основном, эти команды принадлежат пакету 'Tcl'. Но нет никакой связи между командами и пакетами. –

ответ

0

Список и строки не подпадают под любые специальные пакеты. Это основные команды. Все переменные рассматриваются как строка в tcl.

$ tclsh 
    % set l [list 1 2 3 4 5] 
    1 2 3 4 5 
    % lappend l 6 
    1 2 3 4 5 6 
    % set str "Hello, World" 
    Hello, World 
1

Формально все команды, которые формируют ядро ​​языка Tcl обеспечиваются Tcl пакета. Этот пакет необходим для вас до вы запускаете любой код (и должен быть: сама команда package является одной из этих команд). По историческому соглашению большая часть команд Tcl помещается в глобальное пространство имен, которое находится на пути разрешения команд от всего пространств имен. (Это логически последнее на пути, если явно не задано с namespace path.) Некоторые команды Tcl определены в пространстве имен ::tcl, включая справедливое количество внутренних команд, прямой доступ к которым не поддерживается (если он не документирован, он isn ' t, некоторые явно не поддерживаются, но относительно хорошо известны, они находятся в пространстве имен ::tcl::unsupported). Пространство имен ::oo (и его дочерние элементы) зарезервировано для TclOO.

Команды, определенные другими пакетами - особенно любые новые пакеты - должны размещаться в пространстве имен с тем же именем, что и пакет. Это просто соглашение и не соблюдается в более старых пакетах (особенно тех, которые предшествуют механизму пространства имен, таких как Tk и TclX), поскольку считается, что это более важно для поддержания обратной совместимости с существующими сценариями, но вы обязательно найдете его проще всего, если вы последуете за ним. Кроме того, обычно принято считать, что глобальное пространство имен принадлежит главным образом к пользовательскому приложению, несмотря на степень загрязнения из других пакетов; он твой, как ты сочтешь нужным.

Экспортируемые команды пространства имен (которые, как правило, должна быть общественными командами пакета с тем же именем) может быть сделан доступным в другом пространстве имен без квалификации с помощью namespace import:

namespace eval ::foo { 
    proc grill {} { puts "grill!" } 
    namespace export grill 
} 

namespace eval ::bar { 
    namespace import ::foo::grill 
    grill 
    puts [namespace which grill]; # Prints ::bar::grill 
    puts [namespace origin grill]; # Prints ::foo::grill 
} 

В качестве альтернативы (от Tcl 8.5) вы можете обновить разрешение путь пространства имен, так оно и выглядит в другом пространстве имен:

namespace eval ::foo { 
    proc grill {} { puts "grill!" } 
} 

namespace eval ::bar { 
    namespace path ::foo 
    grill 
    puts [namespace which grill]; # Prints ::foo::grill 
    puts [namespace origin grill]; # Prints ::foo::grill 
} 

Обратите внимание, что эти два механизма являются немного по-другому: ш с импортированными командами для команды есть локальный делегат (и поскольку этот делегат на самом деле является командой, вы можете указать rename и т. д.), тогда как при изменении пути таких делегатов нет; команда в исходном пространстве имен находится непосредственно во время разрешения того, что означает grill.

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