首页 > 解决方案 > Nim:具有副作用的别名程序

问题描述

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

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. 有哪些替代方案?

标签: function-pointersside-effectsnim-lang

解决方案


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

if/then 表达式存在相同的问题和相同的解决方案

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

推荐阅读