This is how I would do it 
    
    
    import macros
    
    macro dsl(nodes) =
      result = newStmtList()
      for n in nodes:
        var value: NimNode
        if eqIdent(n[0], "algo1"): value = newLit"Foo"
        elif eqIdent(n[0], "algo2"): value = newLit(123)
        else: error "Unexpected ident: ", n[0]
        for kid in n[1]:
          if eqIdent(kid[0], "evaluate"):
            let body = kid[1]
            result.add quote do:
              template value: untyped = `value`
              `body`
          else:
            error "Unexpected ident: ", kid[0]
    
    dsl:
      algo1:
        evaluate:
          echo "[algo1] Evaluation is " & $value
      algo2:
        evaluate:
          echo "[algo2] Evaluation is " & $value
    
    
    Run

Reply via email to