在 Tcl 中将特定对象的方法作为输入参数传递
Pass a method of a specific object as an input argument in Tcl
我正在编写一个 EDA 实用程序,依赖于 TCL 8.6 兼容 API。我的挑战如下:
我的实用程序在数据库中的晶体管模型上运行,并使用 EDA 供应商的 TCL API 命令进行一些分析。我可以将 TCL 过程 name/pointer 传递给 TCL 命令,分析将依赖于我的代码,而不是 EDA 供应商的代码。内部编写的 proc 接受一个指向 EDA 供应商数据库中特定晶体管实例的指针作为参数。
现在,EDA 供应商允许使用 TCL 8.6,这意味着我想要传递特定对象名称的 name/pointer 而不是全局过程名称或命名空间过程名称。我怎么做?在代码示例中:
oo:class create foo {
constructor {} {
variable numy 2
}
method fooshta { mos_pointer } {
puts "now in mosy [get name $mos_pointer ]"
}
destructor {}
}
foo create bar
analyse_tx -proc < how do I refer to bar's method fooshta?>
在非 OOP 上下文中,代码如下所示:
proc fooshta { mos_pointer } {
puts "now in mosy [get name $mos_pointer ]"
}
analyse_tx -proc fooshta
可以看出,我正在寻找 < how do I refer to bar's method fooshta, so that the EDA tool will invoke it for each transistors' instance? and pass the parameter?>
的答案
谢谢
你不能,不能直接调用,至少不能这样调用:
$procname $thing_to_give_to_your_code
如果改为这样调用:
{*}$procname $thing_to_give_to_your_code
然后你可以通过传入命令前缀.[=19来完成=]
analyse_tx -proc [list bar fooshta]
这是我推荐的。如果调用是这样完成的,它也可能有效:
eval $procname [list $thing_to_give_to_your_code]
这种东西很棒,因为它还可以让您传递诸如绑定到 apply
的 lambda 术语等。这是一个非常灵活的系统(因为它实际上作为一个通用的函数柯里化机制工作)并且非常简单。
但是,如果您受困于这种调用方式:
$procname $thing_to_give_to_your_code
那么我们必须使用间接机制:intra-interpreter alias 会让我们发出命令(所以是的,它将有一个名称)委托给方法:
# The {} are to indicate that this command is aliasing from and to the current interpreter context
interp alias {} delegate-bar-fooshta {} bar fooshta
然后我们可以将delegate-bar-fooshta
作为命令名传入。如果你经常这样做,你可能应该将委托放在对象的命名空间上下文中;制定一种设置方法可能是最简单的方法:
oo::class create foo {
constructor {} {
variable numy 2
}
method fooshta { mos_pointer } {
puts "now in mosy [get name $mos_pointer ]"
}
destructor {}
method delegate {method args} {
# We'll also bind in any extra arguments you choose to use
interp alias {} [self namespace]::delegate-$method \
{} [self] $method {*}$args
return [namespace which delegate-$method]
}
}
foo create bar
analyse_tx -proc [bar delegate fooshta]
通过这样做,使用通常的机制杀死对象也将删除它拥有的委托命令。这在复杂的程序中非常方便,因为它将更多的日常事务从您的脚本中卸载到 Tcl 本身。
我正在编写一个 EDA 实用程序,依赖于 TCL 8.6 兼容 API。我的挑战如下:
我的实用程序在数据库中的晶体管模型上运行,并使用 EDA 供应商的 TCL API 命令进行一些分析。我可以将 TCL 过程 name/pointer 传递给 TCL 命令,分析将依赖于我的代码,而不是 EDA 供应商的代码。内部编写的 proc 接受一个指向 EDA 供应商数据库中特定晶体管实例的指针作为参数。
现在,EDA 供应商允许使用 TCL 8.6,这意味着我想要传递特定对象名称的 name/pointer 而不是全局过程名称或命名空间过程名称。我怎么做?在代码示例中:
oo:class create foo {
constructor {} {
variable numy 2
}
method fooshta { mos_pointer } {
puts "now in mosy [get name $mos_pointer ]"
}
destructor {}
}
foo create bar
analyse_tx -proc < how do I refer to bar's method fooshta?>
在非 OOP 上下文中,代码如下所示:
proc fooshta { mos_pointer } {
puts "now in mosy [get name $mos_pointer ]"
}
analyse_tx -proc fooshta
可以看出,我正在寻找 < how do I refer to bar's method fooshta, so that the EDA tool will invoke it for each transistors' instance? and pass the parameter?>
的答案
谢谢
你不能,不能直接调用,至少不能这样调用:
$procname $thing_to_give_to_your_code
如果改为这样调用:
{*}$procname $thing_to_give_to_your_code
然后你可以通过传入命令前缀.[=19来完成=]
analyse_tx -proc [list bar fooshta]
这是我推荐的。如果调用是这样完成的,它也可能有效:
eval $procname [list $thing_to_give_to_your_code]
这种东西很棒,因为它还可以让您传递诸如绑定到 apply
的 lambda 术语等。这是一个非常灵活的系统(因为它实际上作为一个通用的函数柯里化机制工作)并且非常简单。
但是,如果您受困于这种调用方式:
$procname $thing_to_give_to_your_code
那么我们必须使用间接机制:intra-interpreter alias 会让我们发出命令(所以是的,它将有一个名称)委托给方法:
# The {} are to indicate that this command is aliasing from and to the current interpreter context
interp alias {} delegate-bar-fooshta {} bar fooshta
然后我们可以将delegate-bar-fooshta
作为命令名传入。如果你经常这样做,你可能应该将委托放在对象的命名空间上下文中;制定一种设置方法可能是最简单的方法:
oo::class create foo {
constructor {} {
variable numy 2
}
method fooshta { mos_pointer } {
puts "now in mosy [get name $mos_pointer ]"
}
destructor {}
method delegate {method args} {
# We'll also bind in any extra arguments you choose to use
interp alias {} [self namespace]::delegate-$method \
{} [self] $method {*}$args
return [namespace which delegate-$method]
}
}
foo create bar
analyse_tx -proc [bar delegate fooshta]
通过这样做,使用通常的机制杀死对象也将删除它拥有的委托命令。这在复杂的程序中非常方便,因为它将更多的日常事务从您的脚本中卸载到 Tcl 本身。