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

TCL脚本中是否存在define/parameter(与verilog语言中相同)?,tcl,Tcl,TCL中是否有与C中的#define或parameter相同的命令? 我想使用下面的定义来减少脚本中的代码: lappend links [lindex $all_list $i] $j $k 0 ->这个命令在我的脚本中使用过很多次。 如何将其定义为verilog并在TCL脚本中使用短命令lap_lk 非常感谢:)。Tcl与C(或使用该预处理器的其他语言)中的不完全相同。但是,您可以创建具有所需效果的过程。要执行的过程类型取决于是否传入任何参数 简单,无参数 在最简单的情况下,如果没有参数,

TCL中是否有与C中的
#define
或parameter相同的命令? 我想使用下面的定义来减少脚本中的代码:

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


非常感谢:)。

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
,并假设它们不是太可怕

# 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
将内容注入脚本(我也可以在脚本周围使用双引号),并且我正在使用
list
将引号精确地添加到
$B
$C
中,以确保替换安全;我真的应该在
$A
附近这样做,除了索引通常是安全的。然后您可以这样调用代码:

lap_lk $i $j $k
走向Tcl之道 然而,在更复杂的情况下(例如需要一个非平凡的循环),您将使用
uplevel
upvar
做一些更微妙的事情。这就是你要做的,几乎完全超出了C预处理器所能做的。(使用除
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
}
建议以这种方式将所有(相关)局部变量的名称作为参数传递,而不是硬编码上下文。通常认为最好的做法是使过程尽可能独立于调用上下文。当然,这并不总是可能的


将上述代码更改为不传递显式参数(通过硬编码变量名称)作为练习。

i、j和k来自哪里?你想做什么是proc无法完成的?
# Calling pattern
lap_lk links all_list $i $j $k