# Why macro instead of a function?

**URL:** <https://discourse.julialang.org/t/why-macro-instead-of-a-function/72154>\
**Category:** New to Julia\
**Tags:** macros, functions\
**Created:** [November 27, 2021, 9:02am UTC](https://discourse.julialang.org/t/why-macro-instead-of-a-function/72154 "2021-11-27T09:02:18Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![cesarmarinhorj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cesarmarinhorj/32/30948_2.png) [@cesarmarinhorj](https://discourse.julialang.org/u/cesarmarinhorj)\
**Post date:** [November 27, 2021, 9:02am UTC](https://discourse.julialang.org/t/why-macro-instead-of-a-function/72154/1 "2021-11-27T09:02:18Z")

</div>

why @sprintf instead of sprintf?

---

<div class="post-metadata">

**Author:** ![Vasily\_Pisarev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vasily_pisarev/32/7929_2.png) [@Vasily\_Pisarev](https://discourse.julialang.org/u/Vasily_Pisarev)\
**Post date:** [November 27, 2021, 12:18pm UTC](https://discourse.julialang.org/t/why-macro-instead-of-a-function/72154/2 "2021-11-27T12:18:48Z")

</div>

Now, it can count as a historical accident, like `@evalpoly`.

From 1.6, there is `Printf.Format` for format string and `Printf.format` for producing strings or writing directly to the output.

---

<div class="post-metadata">

**Author:** ![ImreSamu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/imresamu/32/20677_2.png) [@ImreSamu](https://discourse.julialang.org/u/ImreSamu)\
**Post date:** [November 27, 2021, 2:26pm UTC](https://discourse.julialang.org/t/why-macro-instead-of-a-function/72154/3 "2021-11-27T14:26:23Z")

</div>

- “compile-time” vs. “run-time”
- And you can use it in the “code generation” part.
  - like a code generation from a “template” but this is smarter

- [Metaprogramming - Wikipedia](https://en.wikipedia.org/wiki/Metaprogramming)
  - [Metaprogramming · The Julia Language](https://docs.julialang.org/en/v1/manual/metaprogramming/)

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [November 27, 2021, 2:42pm UTC](https://discourse.julialang.org/t/why-macro-instead-of-a-function/72154/4 "2021-11-27T14:42:23Z")

</div>

> [@cesarmarinhorj](#):
>
> why @sprintf instead of sprintf?

Because then the parsing of the format string can be performed at compile time (with the resulting types known to the compiler), not runtime.

(You can also use `Printf.format(Printf.format"...", args...)` to do compile-time parsing of the format string `"..."`, but that’s a lot more cumbersome to write than `@sprintf("...", args...)`.)
