首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Tcl中传递特定对象的方法作为输入参数。

在Tcl中传递特定对象的方法作为输入参数。
EN

Stack Overflow用户
提问于 2017-01-19 08:30:00
回答 1查看 602关注 0票数 1

我正在编写一个EDA实用程序,依赖于一个TCL8.6兼容的API。我的挑战如下:

我的实用工具运行在数据库中的晶体管模型上,并使用EDA供应商的TCL命令进行一些分析。我可以传递给TCL命令一个TCL过程名称/指针,分析将依赖于我的代码,而不是EDA供应商的代码。内部编写的proc作为参数接受指向EDA供应商数据库中特定晶体管实例的指针。现在,EDA供应商允许TCL 8.6,这意味着我希望传递特定对象名称的名称/指针,而不是全局proc名称或名称空间proc名称。我该怎么做?在代码示例中:

代码语言:javascript
复制
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上下文中,代码如下所示:

代码语言:javascript
复制
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?>的答案

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-19 20:03:48

如果要像这样调用它,则不能,至少不能直接调用:

代码语言:javascript
复制
$procname $thing_to_give_to_your_code

如果是这样调用它的话:

代码语言:javascript
复制
{*}$procname $thing_to_give_to_your_code

然后,您可以通过传入命令前缀来完成这一任务。

代码语言:javascript
复制
analyse_tx -proc [list bar fooshta]

这是我推荐的那个。如果调用是这样执行的,那么它也可以工作:

代码语言:javascript
复制
eval $procname [list $thing_to_give_to_your_code]

这类事情很棒,因为它还允许您传递类似lambda项、绑定到apply等的内容。这是一个非常灵活的系统(因为它实际上是一种通用的函数运行机制),而且非常简单。

但是,如果您被这种类型的调用困住了:

代码语言:javascript
复制
$procname $thing_to_give_to_your_code

然后,我们必须使用一种间接机制:一个内部解释器别名将允许我们创建一个命令(所以是的,它将有一个名称),委托给该方法:

代码语言:javascript
复制
# 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作为命令名传入。如果您经常这样做,那么您可能应该将委托放在对象的命名空间上下文中;创建一个设置东西的方法可能是最简单的:

代码语言:javascript
复制
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自己。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41737116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档