Как использовать переменную в качестве значения по умолчанию для аргумента процедуры TCL

У меня есть переменная, которую я хотел бы использовать в качестве значения по умолчанию для аргумента:

proc log {message {output $::output}} {
   ....
}

Есть ли способ сделать это или мне нужно оценить переменную внутри моего процесса?

3 ответа

Решение

Да, но вы не можете использовать фигурные скобки ({}) для вашего списка аргументов. Вы объявляете процедуру, например, так:

proc log [list message [list output $::output]] {
   ....
}

Но учтите:
Переменная оценивается во время, когда процедура объявлена, а не когда она выполняется!

Если вам нужен аргумент по умолчанию, который определяется только в значении во время вызова, вам нужно быть более хитрым. Ключ в том, что вы можете использовать info level 0 чтобы получить список аргументов для текущего вызова процедуры, а затем просто проверить длину этого списка:

proc log {message {output ""}} {
    if {[llength [info level 0]] < 3} {
        set output $::output
    }
    ...
}

Помните, что при проверке списка аргументов первым является имя самой команды.

Еще один способ сделать это:

proc log {message {output ""}} {
    if {$output eq ""} {
        set output $::output
    }
}
Другие вопросы по тегам