Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在Tcl中将特定对象的方法作为输入参数传递_Oop_Tcl_Metadata_Proc - Fatal编程技术网

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

Oop 在Tcl中将特定对象的方法作为输入参数传递,oop,tcl,metadata,proc,Oop,Tcl,Metadata,Proc,我正在编写一个EDA实用程序,它依赖于符合TCL 8.6的API。我的挑战如下:我的实用程序在数据库中的晶体管模型上运行,并使用EDA供应商的TCL API命令进行一些分析。我可以向TCL命令传递一个TCL过程名称/指针,分析将依赖于我的代码,而不是EDA供应商的代码。内部编写的proc接受EDA供应商数据库中特定晶体管实例的指针作为参数。 现在,EDA供应商允许使用TCL 8.6,这意味着我希望传递特定对象名称的名称/指针,而不是全局进程名或命名空间进程名。我该怎么做?在代码示例中: oo:c

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

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?>

可以看出,我正在寻找
<如何引用bar的方法fooshta的答案,以便EDA工具为每个晶体管实例调用它?并传递参数?>


谢谢。

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

$procname $thing_to_give_to_your_code
{*}$procname $thing_to_give_to_your_code
eval $procname [list $thing_to_give_to_your_code]
如果改为按如下方式调用:

$procname $thing_to_give_to_your_code
{*}$procname $thing_to_give_to_your_code
eval $procname [list $thing_to_give_to_your_code]
然后,您可以通过传入命令前缀来执行此操作

analyse_tx -proc [list bar fooshta]
这是我推荐的。如果调用是这样进行的,它也可能工作:

$procname $thing_to_give_to_your_code
{*}$procname $thing_to_give_to_your_code
eval $procname [list $thing_to_give_to_your_code]
这类事情很好,因为它还允许您传递诸如绑定到
apply
的lambda术语等内容。这是一个非常灵活的系统(因为它实际上是一个通用的函数转换机制),而且非常简单

但是,如果您坚持使用这种调用方式:

$procname $thing_to_give_to_your_code
然后,我们必须使用一种间接机制:内部解释器别名将允许我们发出一个命令(因此,是的,它将有一个名称),委托给该方法:

# The {} are to indicate that this command is aliasing from and to the current interpreter context
interp alias {} delegate-bar-fooshta {} bar fooshta
然后我们可以将
委托栏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本身。

1。哇2。谢谢,我将要求EDA供应商扩展接口。您可以很容易地制作代理别名,您不需要供应商的配合。;-)我不。但是如果我能让卖主更努力的工作,也许。。。我们付给他足够的钱了。我一直在看别名的代码。我不明白为什么会有{}[self namespace]{}[self namespace]?它们是某种分隔符吗?