【问题标题】:Nim: aliasing procedures with side effectsNim:具有副作用的别名程序
【发布时间】:2018-12-11 14:39:11
【问题描述】:

我正在尝试创建指向过程(或等效过程)的指针。当我做这样的事情时:

import random

# maybe a command line argument
let choice = "some algorithm"

proc withoutSideEffects(): int = 0
proc withSideEffects(): int = rand(10)

let procPtr =
  case choice
  of "algorithm1": withoutSideEffects
  of "algorithm2": withSideEffects
  (...)

编译器抱怨,要求 case 表达式中的所有过程都必须具有 pragma {.noSideEffects.}

我有以下问题:

  1. 有没有办法解决这个问题?
  2. 如果不是,这是故意的吗(可能是为了阻止糟糕的设计)?
  3. 有哪些替代方案?

【问题讨论】:

  • 问题似乎在于编译器正在从第一个分支中扣除变量类型。如果你交换分支,它就可以正常工作,因为 proc{.noSideEffects,gcsafe.} 可以转换为 proc{.gcsafe.}。
  • 但是,我不确定如何将 procPtr 明确标记为具有副作用,这将是正确的解决方案。
  • 我明白了。我很高兴至少有一个解决方案(这也不太方便)。谢谢!
  • 我已在github.com/nim-lang/Nim/issues/12642 上将此作为问题打开。

标签: function-pointers side-effects nim-lang


【解决方案1】:

解决方案是将 expression 形式(从第一个分支推断其返回类型)替换为 statement 形式(没有返回类型的形式) )

同样的问题,if/then 表达式也存在同样的解决方案

let procPtr = block:
  var result:proc():int
  case choice
  of "algorithm1": result = withoutSideEffects
  of "algorithm2": result = withSideEffects
  else: discard
  result

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 1970-01-01
    • 2021-05-15
    • 2018-08-06
    • 2011-09-27
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多