2013-11-28 31 views
1

我收到了這個奇怪的問題。 我使用TCL 8.3tcl proc使用upvar導致歷史(nextid)

後,我在TCL殼定義這個PROC

% 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) 
% 

每次我打換行 「中輸入」 那 任何一個具有後任何想法爲什麼發生這種情況?

+1

你可能只想'upvar $ varName var' - 使用'#0'意味着你只能使用你的proc和全局變量,局部變量將不會被看到。 –

回答

2

因爲歷史管理是用Tcl本身編寫的,所以使用incr

incr幾乎等於Tcl的8.3的incr有一些區別:

  • 變量的名稱總是打印
  • 如果變量不存在,它將被創建。

所以,如果你刪除第一個差(puts)一切都會按預期工作,只是一些庫命令可能會打電話給你incr代替標準incr

第二個不同之處在於核心IIRC從Tcl 8.5開始,變量已經存在於調用incr並不是絕對必要的。

總之:你做的很好。但不要指望成爲唯一一個調用標準命令的人。