2017-01-19 15 views
1

Я пишу программу EDA, опираясь на API, совместимый с TCL 8.6. Моя задача заключается в следующем:
Моя утилита работает с моделями транзисторов в базе данных и делает некоторый анализ, используя команду API TCL для поставщиков EDA. Я могу передать командам TCL имя/указатель процедуры TCL, и анализ будет полагаться на мой код, а не на код поставщика EDA. Внутренний письменный proc принимает в качестве аргумента указатель на конкретный экземпляр транзистора в базе данных поставщика EDA. Теперь поставщик EDA допускает TCL 8.6, что означает, что я хочу передать, а не глобальное имя proc, или имя проса имени пространства имен, имя/указатель имени конкретного объекта. Как мне это сделать? В примере кода:Передайте метод конкретного объекта в качестве входного аргумента в Tcl

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

В не контексте ООП, код будет выглядеть следующим образом:

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?>
Спасибо.

ответ

1

Вы не можете, не напрямую, по крайней мере, если она будет вызываться так:

$procname $thing_to_give_to_your_code 

Если вместо этого вызывается так:

{*}$procname $thing_to_give_to_your_code 

Тогда вы может сделать это, пройдя префикс команды.

analyse_tx -proc [list bar fooshta] 

Это то, что я рекомендую. Она также может работать, если Invoke делается так:

eval $procname [list $thing_to_give_to_your_code] 

Такого рода вещь велик, поскольку она также позволяет передавать в таких вещах, как точки лямбды, связанные с apply и так далее. Это очень гибкая система (поскольку она фактически работает как механизм каррирования общих функций), и это довольно просто.

Однако, если вы застряли с этим стилем Invoke:

$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 

Тогда можно просто передать 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.

+0

1. wow 2.Спасибо, я попрошу поставщика EDA расширить интерфейс. – user1134991

+0

Поскольку вы можете легко сделать псевдонимы делегатов, вам не нужно, чтобы продавец сотрудничал. ;-) –

+0

Я этого не делаю. Но если я смогу заставить продавца работать усерднее, может также ... мы платим ему достаточно. – user1134991

 Смежные вопросы

  • Нет связанных вопросов^_^