tcl proc использует upvar, что приводит к истории (nextid)

Я получаю эту странную проблему. я использую tcl 8.3

после того, как я определю этот процесс в оболочке tcl

% proc incr { varName {amount 1}} {
    puts $varName
    upvar #0 $varName var
    puts $varName
    if {[info exists var]} {
       set var [expr $var + $amount]
    } else {
       set var $amount
    }
    return $var
}

я продолжаю получать

%
history(nextid)
history(nextid)
history(oldest)
history(oldest)
%

Каждый раз, когда я нажимаю на новую строку "Enter", после этого кто-нибудь понимает, почему это происходит?

1 ответ

Решение

Потому что управление историей написано в самом Tcl, и это использует incr,

Ваш incr почти равен Tcl 8,3 incr с некоторыми отличиями:

  • Имя переменной всегда печатается
  • Если переменная не существует, она будет создана.

Так что, если вы удалите первое различие (puts) все будет работать как положено, просто некоторые библиотечные команды могут вызывать ваши incr вместо стандартного incr,

Второе отличие теперь в ядре, IIRC, начиная с Tcl 8.5, не обязательно, что переменная уже существует перед вызовом incr,

Короче говоря, то, что вы сделали, это хорошо. Но не ожидайте, что будете единственным, кто вызывает стандартную команду.

Другие вопросы по тегам