We already have `{.gcsafe.}`, and `{.noSideEffect.}` blocks and you can tag 
functions as `{.sideeffect.}`. Why stay at Rust level when you can go full 
blown Haskell?

Example C imported function tagged as side-effect: 
<https://github.com/status-im/nim-blscurve/blob/ab07ea0/blscurve/miracl/milagro.nim#L298>
    
    
    proc FP2_BLS12381_output*(x: ptr FP2_BLS12381) {.sideeffect, milagro_func.}
    
    
    Run

And example `{.noSideEffect.}` block for benchmarking:

<https://github.com/status-im/nimbus-eth2/blob/9174132/nbench/bench_lab.nim#L66-L74>
    
    
    template fnEntry(name: string, id: int, startTime, startCycle: untyped): 
untyped =
      ## Bench tracing to insert on function entry
      {.noSideEffect, gcsafe.}:
        discard BenchMetrics[id].numCalls.atomicInc()
        let startTime = getMonoTime()
        when SupportsGetTicks:
          let startCycle = getTicks()
        else:
          let startCycle = 0
    
    
    Run

Reply via email to