Tcl:容忍命令执行中的换行符

Tcl: tolerate line break in command execution

这个tcl问题有点特殊。我有大括号中的文本,其中包含方括号中的命令执行:

proc doit {txt} {
    return $txt
}

set txt {
    
    hallo [doit world]
    
}

puts [subst -novariables -nobackslashes $txt]

输出是hallo world,这就是我想要的。

但是,有时我的编辑器会格式化文本,以便将命令执行分成多行:

set txt {
    
    hallo [doit
    world]
    
}

这会导致错误消息 wrong # args: should be "doit txt"

有什么优雅的方法可以避免这个问题吗?引入反斜杠扩展行不起作用,因为我的编辑器可能会在重新格式化文本后将其放在错误的位置。我想保持换行符不变(否则我可以在使用 subst 之前从 txt 中删除所有换行符)。解析文本并从命令执行中删除换行符似乎有点复杂。

感谢您的帮助!

一个技巧是用花括号将脚本文本包装成 subst 并让 Tcl 解析器在使用 {*} 扩展运算符进行命令替换之前将其解包:

set txt {
    
    hallo [{*}{doit
       
         world}]
    
}

这对重新格式化很有效。但是,我宁愿教你的编辑做事温和。