# Passing macro as function argument?

**URL:** <https://discourse.julialang.org/t/passing-macro-as-function-argument/65898>\
**Category:** General Usage\
**Tags:** macros, metaprogramming\
**Created:** [August 5, 2021, 3:47pm UTC](https://discourse.julialang.org/t/passing-macro-as-function-argument/65898 "2021-08-05T15:47:44Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![tbenst](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tbenst/32/3029_2.png) [@tbenst](https://discourse.julialang.org/u/tbenst)\
**Post date:** [August 5, 2021, 3:47pm UTC](https://discourse.julialang.org/t/passing-macro-as-function-argument/65898/1 "2021-08-05T15:47:44Z")

</div>

I’m trying to benchmark various parallelization approaches, and realized I’m not sure how to change which macro is called…? Is this possible?

```julia
function count_threads(macro_name=Threads.@threads)
    n = Threads.nthreads()
    a = zeros(n)
    # next line is psuedocode
    @macro_name for i = 1:n
           a[i] = Threads.threadid()
    end
    length(unique(a))
end
```

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [August 5, 2021, 3:54pm UTC](https://discourse.julialang.org/t/passing-macro-as-function-argument/65898/2 "2021-08-05T15:54:11Z")

</div>

you can’t because macros are expanded before run time.

---

<div class="post-metadata">

**Author:** ![tbenst](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tbenst/32/3029_2.png) [@tbenst](https://discourse.julialang.org/u/tbenst)\
**Post date:** [August 5, 2021, 3:54pm UTC](https://discourse.julialang.org/t/passing-macro-as-function-argument/65898/3 "2021-08-05T15:54:55Z")

</div>

ah I see, thanks.

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [August 5, 2021, 4:21pm UTC](https://discourse.julialang.org/t/passing-macro-as-function-argument/65898/4 "2021-08-05T16:21:09Z")

</div>

But if you want to use different parallelisms (or not) methods, you should probably look into high-level interfaces like [`ThreadsX.jl`](https://github.com/tkf/ThreadsX.jl) or [`FLoops.jl`](https://github.com/JuliaFolds/FLoops.jl)

---

<div class="post-metadata">

**Author:** ![cjdoris](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cjdoris/32/213133_2.png) [@cjdoris](https://discourse.julialang.org/u/cjdoris)\
**Post date:** [August 5, 2021, 5:03pm UTC](https://discourse.julialang.org/t/passing-macro-as-function-argument/65898/5 "2021-08-05T17:03:29Z")

</div>

A little-known fact is that macros are represented as values just like functions or anything else, they are just a bit harder to get at. And calling them gives the expanded code.

```julia
julia> m = Base.var"@time"
@time (macro with 1 method)

julia> typeof(m)
Base.var"#@time"

julia> m(LineNumberNode(@ __LINE__ , @ __FILE__ ), @ __MODULE__ , :(1+2))
quote
    #= timing.jl:206 =#
    ...
end

```

So you can do what you want if you make `count_threads` a generated function.

---

<div class="post-metadata">

**Author:** ![tbenst](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tbenst/32/3029_2.png) [@tbenst](https://discourse.julialang.org/u/tbenst)\
**Post date:** [August 5, 2021, 6:07pm UTC](https://discourse.julialang.org/t/passing-macro-as-function-argument/65898/6 "2021-08-05T18:07:06Z")

</div>

thanks! I’ve been meaning to try out ThreadsX.jl. Unfortunately, FLoops doesn’t pass this test: [https://github.com/JuliaParallel/Dagger.jl/issues/249#issuecomment-893573042](https://github.com/JuliaParallel/Dagger.jl/issues/249#issuecomment-893573042)
