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