TCL脚本中是否存在define / paramter(与verilog语言相同)?

时间:2016-10-17 03:43:42

标签: tcl

TCL中是否有与#define或C中的参数相同的命令? 我想在脚本中减少我的代码,定义如下:

lappend links [lindex $all_list $i] $j $k 0

- >我的脚本中多次使用此命令。 如何将其define lap_lk lappend links [lindex $all_list $i] $j $k 0定义为verilog并在短命令lap_lk的TCL脚本中使用它?

非常感谢你:)。

1 个答案:

答案 0 :(得分:2)

Tcl与C(或使用该预处理器的其他语言)完全相同。但是,您可以创建具有所需效果的程序。您想要进行的过程类型取决于您是否传入任何参数。

简单,无参数

在最简单的情况下,如果没有参数,您可以在过程中使用uplevel在调用者的上下文中运行一些代码:

proc lap_lk {} {
    uplevel 1 {
        lappend links [lindex $all_list $i] $j $k 0
    }
}

uplevel中的代码(1是可选的,但为了清晰起见,我推荐它)就像运行而不是调用lap_lk一样运行;它使用调用者可见的变量。

带参数

然而,如果你正在接受争论,那么事情变得更加复杂。我们假设您将索引纳入$all_list$i以及部分$j$k,并假设他们& #39;不是可怕......

# Using A B C to make it clear that these are different things
proc lap_lk {A B C} {
    uplevel 1 [subst {
        lappend links \[lindex \$all_list $A] [list $B] [list $C] 0
    }]
}

这里的关键是我使用subst将内容注入脚本(我本可以在脚本周围使用双引号)并且我使用{{1}将list$B引用完全相加,以使其替换安全;我真的应该围绕$C这样做,除了指数通常都是替代安全的。然后,您可以像这样调用代码:

$A

走向Tcl之道

然而,在更复杂的情况下(例如需要非平凡的循环),那么您将使用lap_lk $i $j $k uplevel做一些更微妙的事情。这就是你几乎完全超出C预处理器可以优雅地做的事情。 (使用upvar以外的级别目标是完全超出预处理器功能的地方。)在这种情况下,使用1可以完全避免使用upvar

uplevel
proc lap_lk {targetList sourceList A B C} {
    upvar 1 $targetList tgt $sourceList src
    lappend tgt [lindex $src $A] $B $C 0
}
如果你以这种方式将所有(相关的)局部变量的名称作为参数传递而不是硬编码上下文,那么

通常认为良好的做法是使程序尽可能独立于其调用环境。当然,这并不总是可能的。

将上述代码更改为不传递任何显式参数(通过对变量名称进行硬编码),可以作为练习。