В чем разница между этими двумя функциями в tcl?

#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)" }