# Is it possible to define a macro in one line (one-liner macros)?

**URL:** <https://discourse.julialang.org/t/is-it-possible-to-define-a-macro-in-one-line-one-liner-macros/85649>\
**Category:** General Usage\
**Tags:** macros\
**Created:** [August 12, 2022, 3:24am UTC](https://discourse.julialang.org/t/is-it-possible-to-define-a-macro-in-one-line-one-liner-macros/85649 "2022-08-12T03:24:17Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![singularitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/singularitti/32/17678_2.png) [@singularitti](https://discourse.julialang.org/u/singularitti)\
**Post date:** [August 12, 2022, 3:24am UTC](https://discourse.julialang.org/t/is-it-possible-to-define-a-macro-in-one-line-one-liner-macros/85649/1 "2022-08-12T03:24:17Z")

</div>

We have one-liner functions, can we define macros in one line? Like

```julia
@my(x) = :(println($(esc(x))))

```

which is equivalent to

```julia
macro my(x)
    :(println($(esc(x))))
end

```

I guess not, because sometimes `=` is part of the macro arguments?

---

<div class="post-metadata">

**Author:** ![digital\_carver](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/digital_carver/32/33818_2.png) [@digital\_carver](https://discourse.julialang.org/u/digital_carver)\
**Post date:** [August 12, 2022, 3:34am UTC](https://discourse.julialang.org/t/is-it-possible-to-define-a-macro-in-one-line-one-liner-macros/85649/2 "2022-08-12T03:34:04Z")

</div>

You can in the trivial sense of using semi-colons:

```julia
julia> macro my(x); :(println($(esc(x)))); end
@my (macro with 1 method)

julia> y = [10, 1000];

julia> @my y
[10, 1000]

```

I don’ t think there’s special syntax like the assignment syntax for functions though.

---

<div class="post-metadata">

**Author:** ![singularitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/singularitti/32/17678_2.png) [@singularitti](https://discourse.julialang.org/u/singularitti)\
**Post date:** [August 12, 2022, 3:36am UTC](https://discourse.julialang.org/t/is-it-possible-to-define-a-macro-in-one-line-one-liner-macros/85649/3 "2022-08-12T03:36:24Z")

</div>

> [@digital\_carver](#):
>
> You can in the trivial sense of using semi-colons:

I get that. It just does not look like Julia’s one-liner functions.

---

<div class="post-metadata">

**Author:** ![digital\_carver](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/digital_carver/32/33818_2.png) [@digital\_carver](https://discourse.julialang.org/u/digital_carver)\
**Post date:** [August 12, 2022, 3:40am UTC](https://discourse.julialang.org/t/is-it-possible-to-define-a-macro-in-one-line-one-liner-macros/85649/4 "2022-08-12T03:40:12Z")

</div>

True, and tbh I wouldn’t recommend that syntax in practice - a couple of newlines are worth it for the sake of readability. Especially since macros are on average more complex/harder to understand than functions.

---

<div class="post-metadata">

**Author:** ![Per](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/per/32/10387_2.png) [@Per](https://discourse.julialang.org/u/Per)\
**Post date:** [August 12, 2022, 5:36am UTC](https://discourse.julialang.org/t/is-it-possible-to-define-a-macro-in-one-line-one-liner-macros/85649/5 "2022-08-12T05:36:08Z")

</div>

A macro can return a symbol that is the target for an assignment. For example

```julia
macro my(x)
    Symbol(string("my_", x))
end

@my(x) = 3 # expands to my_x = 3

```

---

<div class="post-metadata">

**Author:** ![singularitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/singularitti/32/17678_2.png) [@singularitti](https://discourse.julialang.org/u/singularitti)\
**Post date:** [August 12, 2022, 5:47am UTC](https://discourse.julialang.org/t/is-it-possible-to-define-a-macro-in-one-line-one-liner-macros/85649/6 "2022-08-12T05:47:09Z")

</div>

Interesting, thanks. However, what I want to simplify is the definition of the macro `@my` into one line.

---

<div class="post-metadata">

**Author:** ![Per](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/per/32/10387_2.png) [@Per](https://discourse.julialang.org/u/Per)\
**Post date:** [August 12, 2022, 6:15am UTC](https://discourse.julialang.org/t/is-it-possible-to-define-a-macro-in-one-line-one-liner-macros/85649/7 "2022-08-12T06:15:47Z")

</div>

My point is that this would break existing code, since the syntax is already used for something else.

---

<div class="post-metadata">

**Author:** ![ffevotte](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ffevotte/32/6587_2.png) [@ffevotte](https://discourse.julialang.org/u/ffevotte)\
**Post date:** [August 12, 2022, 12:24pm UTC](https://discourse.julialang.org/t/is-it-possible-to-define-a-macro-in-one-line-one-liner-macros/85649/8 "2022-08-12T12:24:12Z")

</div>

Not sure it is a good idea: macros should not be written lightly, and as highlighted above the syntax you want collides with existing, valid constructs.

But, assuming for the sake of the argument that you still want this, it should be possible to write a one-line macro (or rather a 3-line macro) that allows you to write one-line macros 😃

```julia
julia> macro onelinemacro(expr)
           # we could/should assert that `expr.head == :(=)`, but then this
           # would not be a one-line macro any more :-)
           esc(Expr(:macro, expr.args...))
       end
@onelinemacro (macro with 1 method)

julia> @onelinemacro my_show(x) = :(println($(QuoteNode(x)), " = ", $(esc(x))))
@my_show (macro with 1 method)

julia> let z = 42
           @my_show z
       end
z = 42

```

---

<div class="post-metadata">

**Author:** ![dylanxyz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dylanxyz/32/36646_2.png) [@dylanxyz](https://discourse.julialang.org/u/dylanxyz)\
**Post date:** [August 12, 2022, 10:45pm UTC](https://discourse.julialang.org/t/is-it-possible-to-define-a-macro-in-one-line-one-liner-macros/85649/9 "2022-08-12T22:45:49Z")

</div>

```julia
var"@my"(mod, source, x) = :(println($(esc(x))))

```
