【发布时间】:2014-10-03 10:47:17
【问题描述】:
首先:我可以自己解决我的问题,但我不明白为什么我的原始解决方案不起作用,这就是我感兴趣的。我试图在这里做一个紧凑的例子:
我正在动态构建数组,每个数组值都是一个列表。让我们从以下程序开始:
# 'collector' is a callback function, expecting a container array, and some
# data used to populate the array.
proc generate { collector arr_name } {
eval $collector $arr_name first XXX YYY
eval $collector $arr_name second UUU VVV
}
# This is the callback function used in our example
proc collect { container_name key valuex valuey } {
upvar $container_name container
lappend container($key) [list $valuex $valuey]
}
# Procedure to write out an array
proc dump { arr_name } {
upvar $arr_name arr
puts $arr_name:
foreach key [array names arr] {
puts "$key : $arr($key)"
}
}
# Main program
array set containerA {}
generate [namespace code { collect }] containerA
dump containerA
到目前为止,还没有什么了不起的。运行这个程序会产生输出
containerA:
second : {UUU VVV}
first : {XXX YYY}
但是现在让我们稍微扩展一下这个程序
# Wrapper function to call 'generate' using a fixed collector function
# ("Currying" the first argument to generate)
proc coll_gen { container_name } {
upvar $container_name container
generate [namespace code { collect }] $container_name ; # This works
# This would not work:
#generate [namespace code { collect }] container
}
array set containerB {}
coll_gen containerB
dump containerB
正如这里所写,这也可以,我们得到输出
containerB:
second : {UUU VVV}
first : {XXX YYY}
现在我的问题是:正如您已经从代码中的 cmets 猜到的那样,我首先将 coll_gen 编写为
proc coll_gen { container_name } {
upvar $container_name container
generate [namespace code { collect }] container
}
我的理由是,由于容器是数组的别名,其名称是通过参数列表传递的,我同样可以将此别名的名称传递给“生成”函数。但是,当我运行代码(Tcl 8.5)时,发现 containerB 是空的。
为什么它也不是这样工作的?
【问题讨论】:
标签: tcl