#tcl
#tcl
Вопрос:
proc hello {} {
puts "hey"
after 1000 hello
}
proc hello {} {
global hello
puts "hey"
set hello [info level 0]
after 1000 [namespace code [info level 0]]
}
Я только что написал простую программу, если добавление пространства имен, глобального <имя процесса>, уровня информации … не означает здесь ничего лишнего, пожалуйста, добавьте свой код, чтобы объяснить значение пространства имен, глобального <имя процесса>, уровня информации…
Когда использовать какую из них?
Комментарии:
1. Вы читали документацию по этим командам?
2. Да, я сделал. Но не в состоянии понять многое. Не могли бы вы , пожалуйста , объяснить .
3. Одна вещь, которая может помочь, — это осознание того, что tcl имеет разные пространства имен (не связанные с
namespace
командой) для имен команд и имен переменных.4. Использование
info level 0
is … делает этот код, вероятно, намного более сложным, чем когда-либо нужно для того, чтобы здороваться каждую секунду. Значение второй действительно появляется, как только вы начинаете передавать нетривиальные аргументы и помещать код в пространства имен, отличные от глобального.
Ответ №1:
Я полагаю, вы уже понимаете, что делает первая и почему? И что мне не нужно объяснять, что global
делает?
Команда info level 0
сообщает точные аргументы, включая имя команды, используемое для вызова команды. Помещая это в a namespace code
, вы создаете скрипт, который может быть вызван из любого места и будет вести себя так, как если бы он был запущен в текущем пространстве имен, что довольно полезно во многих случаях. (Сценарий также выполняет некоторые хитрости с конкатенацией аргументов, которая здесь не нужна, но которая очень помогает при настройке трассировок и других видов конкатенативного обратного вызова вне контекста; результатом namespace code
всегда является правильный список, который действует как префикс вызова команды.)
Использовать их для этого примера слишком сложно! Это становится намного понятнее, когда мы добавляем некоторые аргументы:
namespace eval say {
proc hello1 {person} {
puts "hey $person"
# Note that we have to do additional work here
after 1000 [list ::say::hello1 $person]
}
proc hello2 {person} {
global hello
puts "hey $person"
set hello [info level 0]
# Note that the code here didn't change!
after 1000 [namespace code [info level 0]]
}
}
say::hello1 "Aman Agrawal (from #1)"
say::hello2 "Aman Agrawal (from #2)"
# Be sure to also try:
# namespace eval say { hello2 "Aman Agrawal (from #2, call style 2)" }