Well a similar hack can be done in that case as well but it's still dependent 
on scopes.
    
    
    import std/[macros, genasts]
    
    macro immut(n: typed) =
      if n.kind notin {nnkSym, nnkHiddenDeref}:
        error("Expected a variable", n)
      let
        (n, name) =
          if n.kind == nnkHiddenDeref:
            (n[0], ident($n[0]))
          else:
            (n, ident($n))
        typ = block:
          let typ = n.getType
          if typ[0].eqident"var":
            typ[^1]
          else:
            typ
      
      result =
        genast(name, n, typ):
          template name(): typ = cast[typ](n)
    
    proc doThing(i: var int) =
      immut i
      i = i + 2
    
    var a = 100
    doThing(a)
    
    
    Run

Reply via email to