如何在 Tcl 中创建常量?

How does one create constants in Tcl?

我经常在 tcl 中看到 set 关键字的使用。这不能用于创建常量。如何在 tcl 中创建常量,然后供其他程序使用?

一般来说,常量的大部分用途分为几类:

  1. 枚举值
  2. 神奇的数字
  3. 循环控制因子
  4. 比例因子

在 Tcl 中,对于第一种情况,您通常只使用名称而不是将其映射到整数,整数映射仅在需要它们的情况下应用。甚至位集也可以这样处理,用名称列表代替位集(列表中的名称等同于设置的位)。 Tcl 的 C API 具有帮助解决此问题的相关函数,特别是 Tcl_GetIndexFromObj().

魔法值通常最好锁定在处理它们的代码附近。如果我连接到硬件,我根本不会让魔法值出现在脚本级别(因为我会用 C 编写绑定代码)。

循环控制因素通常最好表示为过程参数的默认值,因为它们是您有时想要覆盖的东西。但是,一旦自定义控制结构可用,它们通常就不再需要了,而且它们更适合 Tcl 工作风格。

比例因子是常量可能有用的情况。我倾向于通过仅使用全局变量或名称空间变量来模拟它们,而不是从其他地方分配给它。 我对允许常量的代码非常感兴趣(特别是不能分配给的变量)作为标准功能, 但我们现在没有。

一旦涵盖了这些情况,剩下的往往是不重要的常量。毕竟,几乎不需要计算用于分配的东西的大小和类似的东西,并且在 TDBC 中不鼓励 SQL 语句中的位置绑定,而支持按名称绑定(更容易正确) ).


创建常量的一种简单方法是在变量上放置一个写跟踪,这样无论何时写入它,它都会重置回其常量值。

set CONSTANT 123
trace add variable CONSTANT write {apply {args {
    global CONSTANT
    # Reset to the constant value; write traces are after the fact
    set CONSTANT 123
    # Make the write give an error
    error "may not change constant"
}}}