proc 内部 const 与外部 const 之间的区别

Difference between a const inside a proc vs outside

这可能是一个非常愚蠢的问题,但除了可见性之外,const 内部和 proc 外部之间是否有任何真正的区别?

const foo = "FOO"

proc test() =
  const bar = "BAR"
  echo foo & bar

test()

就像在内部一样,每次调用 proc 时,堆栈是否会针对 const 增长和收缩,或者因为它是一个 const 是否只是保存在静态内存中申请期间的位置?

我特别询问有关 Nim 的问题,但也欢迎使用其他语言对 differences/similarities 进行思考。

如果您查看生成的 C 代码,您会看到这一行:

STRING_LITERAL(TMP139, "FOOBAR", 6);

这告诉我们 foo & bar 是在编译时求值的。

nimbase.h 有这个:

#define STRING_LITERAL(name, str, length) \
  static const struct {                   \
    TGenericSeq Sup;                      \
    NIM_CHAR data[(length) + 1];          \
  } name = {{length, length}, str}

const 在 Nim 中不仅仅是一个静态内存位置。但在这种情况下,我们似乎确实在静态内存位置获得了字符串 "FOOBAR" 。但是,如果我们用数字替换这些字符串,例如 13,生成的代码只有一个 4 字面值,没有任何存储。

现在,对于实际问题。这里唯一的区别是常量的可见范围。

如果这不是以这种方式简化的(例如,如果您写了 echo foo\echo bar),我们可以再次查阅生成的代码并看到两个相同的(除了内容)STRING_LITERAL 声明。