【问题标题】:Pass a method of a specific object as an input argument in Tcl在 Tcl 中将特定对象的方法作为输入参数传递
【发布时间】:2017-01-19 08:30:00
【问题描述】:

我正在编写一个 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?>

在非 OOP 上下文中,代码如下所示:

proc fooshta { mos_pointer } {
      puts "now in mosy [get name $mos_pointer ]"
   }
 analyse_tx -proc fooshta


可以看出,我正在寻找 &lt; 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?&gt;的答案
谢谢。

【问题讨论】:

    标签: oop tcl metadata proc


    【解决方案1】:

    你不能,不能直接,至少不能像这样调用它:

    $procname $thing_to_give_to_your_code
    

    如果改为这样调用:

    {*}$procname $thing_to_give_to_your_code
    

    那么你可以通过传入一个命令前缀来做到这一点。

    analyse_tx -proc [list bar fooshta]
    

    这是我推荐的。如果调用是这样完成的,它也可能起作用:

    eval $procname [list $thing_to_give_to_your_code]
    

    这种东西很棒,因为它还可以让你传递一些东西,比如绑定到apply 的 lambda 术语等等。这是一个非常灵活的系统(因为它实际上是作为通用函数柯里化机制工作的)而且非常简单。

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

    $procname $thing_to_give_to_your_code
    

    那么我们必须使用间接机制:内部解释器 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 本身。

    【讨论】:

    • 1. wow 2. 谢谢,我会请EDA厂商扩展接口
    • 既然你可以很容易地制作代理别名,你不需要供应商合作。 ;-)
    • 我没有。但如果我能让供应商更努力地工作,还不如……我们付给他足够的钱。
    • 嗨。我一直在查看别名的代码。我不明白为什么会有 {} [self namespace] {} [self namespace]?它们是某种分隔符吗?
    猜你喜欢
    • 2020-06-05
    • 2017-10-26
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多