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

How to mark non-pure function as pure in Nim

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

我正在使用 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,它没有副作用。

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

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

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