如何在 Nim 中将非纯函数标记为纯函数

问题描述

有没有办法将非纯函数 p 标记为纯函数?也许有一些pragma?

我使用 p 进行调试,它不能在纯 func 过程中使用。

playground

proc p(message: string): void = echo message

func purefn: void =
  p "track"
  
purefn()

错误

/usercode/in.nim(3,6) Error: 'purefn' can have side effects

解决方法

嗯,首先您可以使用 debugEcho 而不是 echo - 它没有副作用(而且它是专门为这样的用例制作的)。

在其他情况下,您可以通过以下方式向编译器“撒谎”:

proc p(message: string) = 
  {.cast(noSideEffect).}:
    echo message

func purefn =
  p "track"
  
purefn()

https://nim-lang.org/docs/manual.html#pragmas-nosideeffect-pragma中所述,但我不建议这样做。

,

对于您的情况,您可以在 echo 中使用 debugEcho 来伪造没有副作用。

除此之外,如果您没有在实际代码中使用 {.cast(noSideEffect).},则可以使用 echo 编译指示:

proc p(message: string): void = echo message

func purefn: void =
  {.cast(noSideEffect).}:
    p "track"
  
purefn()