# Eval() vs @eval

**URL:** <https://discourse.julialang.org/t/eval-vs-eval/17091>\
**Category:** General Usage\
**Created:** [November 2, 2018, 5:00pm UTC](https://discourse.julialang.org/t/eval-vs-eval/17091 "2018-11-02T17:00:33Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![essenciary](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/essenciary/32/210469_2.png) [@essenciary](https://discourse.julialang.org/u/essenciary)\
**Post date:** [November 2, 2018, 5:00pm UTC](https://discourse.julialang.org/t/eval-vs-eval/17091/1 "2018-11-02T17:00:33Z")

</div>

I expected that the two forms would yield identical results. But to my surprise:

```julia
julia> @eval :x
:x

julia> eval(:x)
ERROR: UndefVarError: x not defined
Stacktrace:
 [1] top-level scope
 [2] eval at ./boot.jl:319 [inlined]
 [3] eval(::Symbol) at ./client.jl:389
 [4] top-level scope at none:0

```

Is that to be expected?

---

<div class="post-metadata">

**Author:** ![essenciary](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/essenciary/32/210469_2.png) [@essenciary](https://discourse.julialang.org/u/essenciary)\
**Post date:** [November 2, 2018, 5:03pm UTC](https://discourse.julialang.org/t/eval-vs-eval/17091/2 "2018-11-02T17:03:11Z")

</div>

OK, they definitely don’t have the same behaviour:

```julia
julia> ex = :(x = 2)
:(x = 2)

julia> eval(ex)
2

julia> x
2

julia> ex = :(y = 2)
:(y = 2)

julia> @eval ex
:(y = 2)

julia> y
ERROR: UndefVarError: y not defined

```

---

<div class="post-metadata">

**Author:** ![cormullion](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cormullion/32/49131_2.png) [@cormullion](https://discourse.julialang.org/u/cormullion)\
**Post date:** [November 2, 2018, 5:03pm UTC](https://discourse.julialang.org/t/eval-vs-eval/17091/3 "2018-11-02T17:03:57Z")

</div>

[Useful?](https://en.wikibooks.org/wiki/Introducing_Julia/Metaprogramming#eval()_and_@eval)

---

<div class="post-metadata">

**Author:** ![essenciary](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/essenciary/32/210469_2.png) [@essenciary](https://discourse.julialang.org/u/essenciary)\
**Post date:** [November 2, 2018, 5:04pm UTC](https://discourse.julialang.org/t/eval-vs-eval/17091/4 "2018-11-02T17:04:29Z")

</div>

Nevermind, I figured it out… Silly me, the `@eval` macro should take an expression as an argument, not a Symbol!

---

<div class="post-metadata">

**Author:** ![ExpandingMan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/expandingman/32/866_2.png) [@ExpandingMan](https://discourse.julialang.org/u/ExpandingMan)\
**Post date:** [November 2, 2018, 5:05pm UTC](https://discourse.julialang.org/t/eval-vs-eval/17091/5 "2018-11-02T17:05:34Z")

</div>

> [@essenciary](#):
>
> Is that to be expected?

Yes. The input to macros is always converted to an expression, the output is getting evaluated. So, when you do `@eval :x`, inside the macro the argument is `:(:x)`. When that gets returned, it is evaluated, giving the symbol `:x`.

By contrast, `eval` takes as an argument an `Expr` or `Symbol` object. So, when it runs, it’s running the code contained in that `Expr` (or `Symbol`) which is in this case just `x`.

---

<div class="post-metadata">

**Author:** ![essenciary](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/essenciary/32/210469_2.png) [@essenciary](https://discourse.julialang.org/u/essenciary)\
**Post date:** [November 2, 2018, 5:05pm UTC](https://discourse.julialang.org/t/eval-vs-eval/17091/6 "2018-11-02T17:05:41Z")

</div>

Thanks – I figured it out that I was `@eval`ing a Symbol into existence.

---

<div class="post-metadata">

**Author:** ![essenciary](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/essenciary/32/210469_2.png) [@essenciary](https://discourse.julialang.org/u/essenciary)\
**Post date:** [November 2, 2018, 5:06pm UTC](https://discourse.julialang.org/t/eval-vs-eval/17091/7 "2018-11-02T17:06:11Z")

</div>

Yessss, thank you! 🙂

---

<div class="post-metadata">

**Author:** ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)\
**Post date:** [November 2, 2018, 5:39pm UTC](https://discourse.julialang.org/t/eval-vs-eval/17091/8 "2018-11-02T17:39:11Z")

</div>

You can splice expressions into `@eval`, so you can make your examples work:

```julia
julia> ex = :(y = 2)
:(y = 2)

julia> @eval $ex
2

julia> y
2

```
