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
,
Короче говоря, то, что вы сделали, это хорошо. Но не ожидайте, что будете единственным, кто вызывает стандартную команду.