副作用

noSideEffect 编译指示用于标记过程和迭代器,说明它们只能通过参数产生副作用。这意味着这个过程或迭代器只能修改参数所涉及的地址,而且返回值只依赖于参数。假如该过程或迭代器的参数中都不是 var、ref、 ptr、 cstring 或 proc 类型,则不会修改外部内容。

换句话说,如果一个例程既不访问本地线程变量或全局变量,也不调用其他带副作用的例程,则该例程是无副作用的。

如果给予一个过程或迭代器无副作用标记,而编译器却无法验证,将引发静态错误。

作为一个特殊的语义规则,内置的debugEcho忽略副作用,这样它就可以用于调试标记为 noSideEffect 的例程。

func 是无副作用过程的语法糖:

  1. func `+` (x, y: int): int

{.cast(noSideEffect).} 编译指示可覆盖编译器的副作用分析:

  1. func f() =
  2. {.cast(noSideEffect).}:
  3. echo "test"

副作用通常可被推断出来,与异常追踪的推断类似。