Tcl数组语法

Tcl数组语法,tcl,Tcl,我在一些Tcl中有这个程序 proc AddType {type} { set map (...code to create the map here...) if {[info exists map("$type")]} { set frame $map("$type") } else { set frame [MakeFrame] } } 这是正确的。不幸的是,中间的一些东西“打破”记事本+的语法高亮,这样显示: 如

我在一些Tcl中有这个程序

proc AddType {type} {
    set map (...code to create the map here...)
    if {[info exists map("$type")]} {    
        set frame $map("$type")
    } else {
        set frame [MakeFrame]
    }
}
这是正确的。不幸的是,中间的一些东西“打破”记事本+的语法高亮,这样显示:

如果我将
$map(“$type”)
更改为
$map(“$type”)
,那么所有人都会对语法突出显示感到满意:

但是,Tcl随后无法加载。这是一些遗留的Tcl,这个过程接近一个相当大的文件的开头,从这一点到文件的结尾,所有的语法高亮显示都是错误的,所以它非常令人恼火


有没有其他方法可以重做数组访问,这样它仍然可以工作,并且Notepad++的语法高亮显示会很好?

我使用Textpad,当我放入TCL文件时,您的程序看起来很好

您可以做的是删除$type周围的双引号。它们是不需要的,也就是说

改变

if {[info exists map("$type")]} {    
        set frame $map("$type")


:“在Tcl中,一切都是一个字符串。引用字符串基本上是不必要的,甚至可能是有害的,如本例中所示……”你可以阅读这篇文章,看看它是如何有害的。没有必要的“基本上”让我有点害怕,但这给了我一些可以处理的东西。在这种情况下,你引用的是一个变量,而不是字符串。所以我想说绝对没有必要。“大部分”并不是指不一致,而是指对含义的全面讨论可能会很长(例如,有八种基本方法可以使用DQOUTS和大括号的组合来取消对变量名的引用,其中一种方法会因微妙的交互而失败)。这里的问题是Notepad++将双引号视为表示字符串文字,而在Tcl中,双引号用于“软引号”字符串(删除空格和大括号等的语法效果)。所以,是的,测试它是否有效,但如果它确实有效,您可以确信它将始终有效。
info exists
将返回false,因为您在上面做了一个
设置映射[某物]
,确保
映射
不是数组……“它们不需要”将需要测试,特别是针对其他模块、其他地方的遗留代码、定制、持久化值等,但我很乐意尝试。如果成功的话,我会接受答案,但如果不成功的话,我希望能对问题进行改进。测试总是明智的:)@ClickRick:在这种情况下,绝对不需要引用。
if {[info exists map($type)]} {    
        set frame $map($type)