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脚本中使用它?
非常感谢你:)。
答案 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
然而,在更复杂的情况下(例如需要非平凡的循环),那么您将使用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
}
如果你以这种方式将所有(相关的)局部变量的名称作为参数传递而不是硬编码上下文,那么通常认为良好的做法是使程序尽可能独立于其调用环境。当然,这并不总是可能的。
将上述代码更改为不传递任何显式参数(通过对变量名称进行硬编码),可以作为练习。