# How to rewrite this macro?

**URL:** <https://discourse.julialang.org/t/how-to-rewrite-this-macro/73333>\
**Category:** New to Julia\
**Tags:** macros, metaprogramming\
**Created:** [December 19, 2021, 4:04pm UTC](https://discourse.julialang.org/t/how-to-rewrite-this-macro/73333 "2021-12-19T16:04:37Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Bardo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bardo/32/21601_2.png) [@Bardo](https://discourse.julialang.org/u/Bardo)\
**Post date:** [December 19, 2021, 4:04pm UTC](https://discourse.julialang.org/t/how-to-rewrite-this-macro/73333/1 "2021-12-19T16:04:37Z")

</div>

I use the macro below for a partial evaluation for a [Macro to serialize a linear solver code](https://discourse.julialang.org/t/macro-to-serialize-a-linear-solver-code/73259).  
The code change is done on the string form.  
Can the macro be written without converting forth and back?  
Got lost in quoting and escaping.

```julia
macro mint(e)
    @show e.args # [:A, :i, :j]
    s = string(e) # Expr -> String
    s = replace(s, "i" => "\$i") # replace index names by their interpolation
    s = replace(s, "j" => "\$j")
    s = replace(s, "k" => "\$k")
    s = ":($s)" # quote to keep expression
    e = Meta.parse(s) # String -> Expr
    @show e.args # [:(A[$(Expr(:$, :i)), $(Expr(:$, :j))])]
    quote
      $(esc(e))                           
    end
end

i =1; j = 2
A = rand(2,2)
@mint A[i, j] # :(A[1, 2])

```

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [December 19, 2021, 5:09pm UTC](https://discourse.julialang.org/t/how-to-rewrite-this-macro/73333/2 "2021-12-19T17:09:34Z")

</div>

`dump` is your friend. Just pass it the final expression you want and you can “dissect” it with that.

---

<div class="post-metadata">

**Author:** ![Bardo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bardo/32/21601_2.png) [@Bardo](https://discourse.julialang.org/u/Bardo)\
**Post date:** [December 19, 2021, 5:13pm UTC](https://discourse.julialang.org/t/how-to-rewrite-this-macro/73333/3 "2021-12-19T17:13:51Z")

</div>

Works - TYVM!

```julia
macro mint(e)
  e = Expr(:quote, Expr(:ref, e.args[1], map(i->:($(Expr(:$, i))), e.args[2:end])...))
  quote
    $(esc(e))         
  end
end

```
