【问题标题】:sourcing a tcl file in itcl code at the global level在全局级别在 itcl 代码中获取 tcl 文件
【发布时间】:2018-04-29 01:31:46
【问题描述】:

我有一个 tcl 文件,其中定义了几个配置过程。我的一个应用程序是在 itcl 中编码的,它需要为每个对象调用这些配置过程。我无法在 itcl 的全局级别获取 TCL 文件。它只允许在公共方法中采购,但这不是我想要的。我想一次只为所有对象获取 tcl 文件,然后使用它直到程序运行。 请问有什么建议吗?

谢谢

【问题讨论】:

  • 我从不使用itcl,但你肯定可以uplevel #0 [list source foo.tcl]?
  • 正如彼得所写,这应该就是这样做的。无论如何,您应该发布一个 MVC 示例。

标签: tcl itcl


【解决方案1】:

source 命令总是当前级别评估文件的内容;它实际上只是将文件的内容读入一个字符串然后eval(除了info script 的一些小技巧)。这意味着,如果您想在全局上下文中 source 一个文件,您应该执行以下操作之一:

# Quotes around #0 just because of Stack Overflow's highlighting
uplevel "#0" {
    source thefile.tcl
}
uplevel "#0" [list source $thefile]
namespace eval :: {
    source thefile.tcl
}
namespace eval :: [list source $thefile]

带有list 的版本正在生成代码,并且当文件名在变量中(或由类似file join 的命令生成)时会更好地工作;如果一切都是字面意思,你最好使用大括号的版本。

带有uplevel #0 的版本与带有namespace eval :: 的版本不同,前者将堆栈up 到全局级别,而后者只是推送一个新的堆栈帧,您可以uplevel 出。大多数时候,使用健全的代码,差异非常小。使用你喜欢的那个,因为两者都是很好的代码。

【讨论】:

  • 也许apply [list {} [list source $thefile] ::]也值得一提?
  • 但这有别的作用;其中不合格的变量是局部的而不是全局的。
  • 当然可以,但这在某些情况下可能很好,甚至是必需的。鉴于问题仅与“config procs”有关(因此全局 NS 中的命令解析),这是一个可行的选择,因此不会污染任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2016-02-22
相关资源
最近更新 更多