常量和常量表达式

常量 是一个与常量表达式值绑定的符号。 常量表达式仅限于依赖于以下类别的值和操作,因为它们要么构建在语言中,要么在对常量表达式进行语义分析之前进行声明和求值:

  • 字面值
  • 内置运算符
  • 之前声明的常量和编译时变量
  • 之前声明过的宏和模板
  • 之前声明的过程除了可能修改编译时变量之外没有任何副作用

常量表达式可以包含可以在内部使用编译时支持的所有Nim功能的代码块(详见下一节)。 在这样的代码块中,可以声明变量然后稍后读取和更新它们,或者声明变量并将它们传递给修改它们的过程。 但是,此类块中的代码仍必须遵循上面列出的用于引用块外部的值和操作的限制。

访问和修改编译时变量的能力增加了常量表达式的灵活性。 例如,下面的代码在 编译时 打印Fibonacci数列的开头。 (这是对定义常量的灵活性的证明,而不是解决此问题的推荐样式!)

  1. import strformat
  2.  
  3. var fib_n {.compileTime.}: int
  4. var fib_prev {.compileTime.}: int
  5. var fib_prev_prev {.compileTime.}: int
  6.  
  7. proc next_fib(): int =
  8. result = if fib_n < 2:
  9. fib_n
  10. else:
  11. fib_prev_prev + fib_prev
  12. inc(fib_n)
  13. fib_prev_prev = fib_prev
  14. fib_prev = result
  15.  
  16. const f0 = next_fib()
  17. const f1 = next_fib()
  18.  
  19. const display_fib = block:
  20. const f2 = next_fib()
  21. var result = fmt"Fibonacci sequence: {f0}, {f1}, {f2}"
  22. for i in 3..12:
  23. add(result, fmt", {next_fib()}")
  24. result
  25.  
  26. static:
  27. echo display_fib