gpt4 book ai didi

tcl - upvar 的作用是什么?

转载 作者:行者123 更新时间:2023-12-01 08:53:18 28 4
gpt4 key购买 nike

在我目前处理的 TCL 代码中,每个过程中的参数都被 upvar'ed 到一个局部变量,可以这么说,然后使用。像这样的:

proc configure_XXXX { params_name_abc params_name_xyz} {
upvar $params_name_abc abc
upvar $params_name_xyz xyz
}

从这里开始,abcxyz 将被用来做任何事情。我读了upvar TCL wiki但无法理解优点。我的意思是为什么我们不能只使用已收到的变量作为过程中的参数。谁能详细说明一下?

最佳答案

I mean why cant we just use the variables that have been received as the arguments in the procedure.

你可以。它只是变得烦人。

通常,当您将变量的 name 传递给命令时,命令可以修改该变量。这方面的经典例子是 setincr 命令,这两个命令都将变量的名称作为第一个参数。

set thisVariable $thisValue

您也可以对过程执行此操作,但是当变量是在过程调用者的上下文中定义的变量时,您需要从过程的上下文访问该变量,该变量可能是命名空间或可能是一个不同的局部变量框架。为此,我们通常使用 upvar,它将一个局部变量的别名设置为另一个上下文中的变量。

例如,这里是 incr 的重新实现:

proc myIncr {variable {increment 1}} {
upvar 1 $variable v
set v [expr {$v + $increment}]
}

为什么写入局部变量 v 会导致调用者上下文中的变量被更新?因为我们给它起了别名(在内部,它是通过一个指向另一个变量的存储结构的指针来设置的;一旦 upvar 完成它就会非常快)。 globalvariable 使用相同的底层机制;它们都归结为快速变量别名。

如果你使用 uplevel 代替,你可以不这样做,但这会变得相当烦人:

proc myIncr {variable {increment 1}} {
set v [uplevel 1 [list set $variable]]
set v [expr {$v + $increment}]
uplevel 1 [list set $variable $v]
}

太恶心了!

或者,假设我们根本没有这样做。然后我们需要通过它的值传递变量,然后分配结果:

proc myIncr {v {increment 1}} {
set v [expr {$v + $increment}]
return $v
}

# Called like this
set foo [myIncr $foo]

有时是正确的,但工作方式完全不同!

Tcl 的核心原则之一是您可以使用标准库命令(例如 ifputsincr) 也可以使用您自己编写的命令来完成。没有关键字。自然可能存在一些效率问题,并且某些命令可能需要用另一种语言(例如 C)完成才能正常工作,但语义不会使任何命令特别。它们全部只是简单的命令。

关于tcl - upvar 的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35506914/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com