tcl: завернуть процесс с тем же именем - PullRequest
4 голосов
/ 24 мая 2011

Я хочу заменить определение "proc N" на proc с тем же именем и соглашениями о вызовах, но с небольшим дополнительным кодом обнаружения ошибок.

В Python я мог делать то, что я хочу, как показано ниже, но я не понимаю, как пространства имен и функции работают в tcl.

__orig_N = N
def N(arg1, arg2):
    if arg1 != 'GOOD VALUE':
        exit('arg1 is bad')
    return __orig_N(arg1, arg2)

Ответы [ 2 ]

10 голосов
/ 24 мая 2011

Вы можете использовать команду rename для переименования существующего процесса:

rename N __orig_N
proc N {arg1 arg2} {
    if { $arg1 != "GOOD_VALUE" } {
        puts stderr "arg1 is bad"
        exit 1
    }
    return [uplevel 1 __orig_N $arg1 $arg2]
}

Это немного сложнее, чем оригинал Python, поскольку использование uplevel эффективно исключаетОболочка из стека вызовов целиком - что, разумеется, может и не понадобиться в вашем случае, но приятно делать это.

4 голосов
/ 24 мая 2011

У Tcl достаточно хороший самоанализ на процедурах. Это позволяет вам переписать процедуру, чтобы добавить еще немного кода:

# Assume there are no defaults; defaults make this more complicated...
proc N [info args N] [concat {
    # Use 'ne' for string comparison, '!=' for numeric comparison
    if {$arg1 ne "GOOD VALUE"} {
        error "arg1 is bad"
        # The semicolon is _important_ because of the odd semantics of [concat]
    };
} [info body N]]

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

...