全部, 需要以下建议。 在我在cvs中提交新的tcl proc之前,我想检查正在提交的新procs是否具有预先存在的tcl procs的重复名称。如果名称中有重复,我们可以中止提交。
提前致谢。
答案 0 :(得分:0)
您可以使用dict
来检查重复项:
dict exists $hash procName
dict append hash procName value
所以
if ![dict exists $hash procName] {dict append hash procName value}
答案 1 :(得分:0)
好吧,我建议使用Tcl本身而不是使用bash或python。我假设你有Tcl 8.5或更高版本。
基本思想是使用一个解释器,它忽略除proc定义之外的大多数命令。
set ip [interp create]
interp hide $ip source
interp eval $ip {
rename ::tcl::info::frame tcl:info:frame
}
interp hide $ip tcl:info:frame
interp eval $ip {
namespace delete ::
}
proc NOP args {}
interp alias $ip unknown {} NOP
现在我们需要以特殊方式处理一些命令:
proc qualify-cmd {name} {
return $name
}
proc proc-alias {name arg body} {
define-cmd [qualify-cmd $name]
}
interp alias $ip proc {} proc-alias
proc define-cmd {name} {
global procs
set frameinfo [interp invokehidden $::ip tcl:info:frame 1]
if {[dict get $frameinfo type] eq "source"} {
set file [dict get $frameinfo file]
set line [dict get $frameinfo line]
} else {
set file "<unknown>"
set line 0
}
if {[dict exists $procs $name]} {
set ofile [dict get $procs $name file]
set oline [dict get $procs $name line]
return -code error "proc redefiniton of $name in $file line $line (original $ofile line $oline)"
} else {
dict set procs $name file $file
dict set procs $name line $line
}
}
# Load the old definitions
set procs {}
# Now we have to source changed file in the slave interp
proc checkfile {file} {
global procs
dict for {name val} $procs {
if {[dict get $val file] eq $file} {
dict unset procs $name
}
}
interp invokehidden $ip source foobar.tcl
}
其余的是最艰苦的工作,但我不确定你是否需要它:
namespace
命令并修改qualify-cmd
。if
或while
等内部定义命令。unknownvar
)