求值顺序

求值顺序是从左到右、从内到外,和大多数其他典型的命令式编程语言一样:

  1. var s = ""
  2.  
  3. proc p(arg: int): int =
  4. s.add $arg
  5. result = arg
  6.  
  7. discard p(p(1) + p(2))
  8.  
  9. doAssert s == "123"

赋值也不例外,左侧表达式在右侧之前进行求值:

  1. var v = 0
  2. proc getI(): int =
  3. result = v
  4. inc v
  5.  
  6. var a, b: array[0..2, int]
  7.  
  8. proc someCopy(a: var int; b: int) = a = b
  9.  
  10. a[getI()] = getI()
  11.  
  12. doAssert a == [1, 0, 0]
  13.  
  14. v = 0
  15. someCopy(b[getI()], getI())
  16.  
  17. doAssert b == [1, 0, 0]

基本原理:与重载赋值或赋值类操作的一致性 a = b 可以读作 performSomeCopy(a, b).