Manpages

______________________________________________________________________________

NAME

upvar - 建 立 到 在 不 同 棧 楨 上 的 變 量 的 連 接

總 覽 SYNOPSIS

upvar ?level? otherVar myVar ?otherVar myVar ...? _________________________________________________________________

描 述 DESCRIPTION

這 個 命 令 安 排 在 當 前 過 程 中 的 一 個 或 多 個 局 部 變 量 去 引 用 位 於 包 圍 它 的 過 程 調 用 中 的 變 量 或 引 用 全 局 變 量 。 Level 可 以 用 uplevel 命 令 允 許 的 任 何 形 式 , 並 且 如 果 第 一 個 otherVar 的 第 一 個 字 母 不 是 # 或 一 個 數 字 , 則 可 以 被 省 略 (它 缺 省 爲 1)。 對 於 每 個 otherVar 參 數 , upvar 使 由 level 給 出 的 過 程 楨 中 (如 果 level#0 則 在 全 局 層 次 )的 叫 這 個 名 字 的 變 量 在 當 前 過 程 中 可 以 用 由 相 應 的 myVar 參 數 給 出 名 字 來 訪 問 。 在 調 用 它 的 時 候 叫 做 otherVar 的 變 量 不 需 要 存 在 ; 可 以 在 第 一 次 引 用 myVar 時 象 普 通 變 量 那 樣 建 立 它 。 在 調 用 upvar 的 時 候 一 定 不 能 存 在 一 個 叫 myVar 的 變 量 。 MyVar 總 是 被 作 爲 一 個 變 量 的 名 字 來 對 待 , 而 不 是 一 個 數 組 的 元 素 。 即 使 這 個 名 字 看 起 來 象 一 個 數 組 元 素 , 比 如 a(b), 仍 建 立 一 個 正 規 的 變 量 。 OtherVar 可 以 引 用 一 個 標 量 變 量 , 或 一 個 數 組 元 素 。 Upvar 返 回 一 個 空 串 。

upvar 命 令 簡 化 了 傳 名 調 用 (call-by-name)過 程 的 實 現 並 使 它 易 於 建 立 如 同 Tcl 過 程 的 新 控 制 結 構 。 例 如 , 考 慮 下 列 過 程 :

proc add2 name {

upvar $name x

set x [expr $x+2] } 調 用Add2 時 加 上 給 出 一 個 變 量 名 字 的 一 個 參 數 , 它 向 這 個 變 量 的 值 加 二 。 儘 管 add2 可 以 使 用 uplevel 替 代 upvar 來 實 現 , upvar 簡 便 了 add2 訪 問 在 調 用 者 過 程 楨 中 的 變 量 。

namespace eval 是 改 變 Tcl 命 令 上 下 文 的 另 一 種 方 式 (除 了 過 程 調 用 之 外 )。 它 向 棧 增 加 一 個 調 用 楨 來 表 示 名 字 空 間 上 下 文 。 這 意 味 着 每 個 namespace eval 命 令 被 視 爲 給 uplevelupvar 命 令 的 另 一 個 調 用 層 次 。 例 如 , info level 1 將 返 回 描 述 一 個 命 令 的 列 表 , 它 要 麼 是 最 外 的 過 程 要 麼 是 最 外 的 namespace eval 命 令 。 還 有 , uplevel #0 在 最 外 面 的 名 字 空 間 (全 局 名 字 空 間 )中 的 頂 層 求 值 一 個 腳 本 。 如 果 刪 除 (unset)一 個 upvar 變 量 (比 如 , 上 面 的 add2 中 的 x ), 則 unset 作 影 響 它 所 連 接 到 的 變 量 , 而 不 是 upvar 變 量 。 除 了 退 出 在 其 中 定 義 它 的 那 個 過 程 之 外 , 沒 有 方 法 刪 除 一 個 upvar 變 量 。 但 是 , 可 以 通 過 執 行 另 一 個 upvar 令 來 爲 一 個 upvar 變 量 重 定 目 標 (retarget)。

Traces 和 upvar

upvar 以 一 種 直 接 但 可 能 不 是 預 期 的 方 式 與 trace 交 互 。 如 果 在 otherVar 上 定 義 了 一 個 變 量 跟 蹤 , 涉 及 myVar 的 動 作 將 觸 發 這 個 追 蹤 。 但 是 , 傳 遞 給 跟 蹤 過 程 將 是 myVar 的 名 字 , 而 不 是 otherVar 的 名 字 。 所 以 , 下 列 代 碼 的 輸 出 將 是 localVar 而 不 是 originalVar:

proc traceproc { name index op } {

puts $name }

proc setByUpvar { name value } {

upvar $name localVar

set localVar $value }

set originalVar 1
trace variable originalVar w traceproc

setByUpvar originalVar 2
} 如 果otherVar 引 用 一 個 數 組 的 元 素 , 則 爲 整 個 數 組 設 置 的 變 量 跟 蹤 在 myVar 訪 問 的 時 候 將 不 被 調 用 (但 在 特 定 元 素 上 的 跟 蹤 仍 將 被 調 用 )。 特 別 的 , 如 果 這 個 數 組 是 env, 則 對 myVar 的 變 動 將 不 被 正 確 的 傳 遞 給 子 進 程 。

參 見 SEE ALSO

global(n), namespace(n), uplevel(n), variable(n)

關 鍵 字 KEYWORDS

context, frame, global, level, namespace, procedure, variable

[中 文 版 維 護 人 ]

寒 蟬 退 士

[中 文 版 最 新 更 新 ]

2001/11/21

《 中 國 Linux 論 壇 man 手 冊 頁 翻 譯 計 劃 》 :

http://cmpp.linuxforum.net

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。 中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh