# TOPLEVEL Expressions

**URL:** <https://discourse.julialang.org/t/toplevel-expressions/6153>\
**Category:** General Usage\
**Created:** [September 29, 2017, 8:08am UTC](https://discourse.julialang.org/t/toplevel-expressions/6153 "2017-09-29T08:08:45Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Qiyamah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/qiyamah/32/2660_2.png) [@Qiyamah](https://discourse.julialang.org/u/Qiyamah)\
**Post date:** [September 29, 2017, 8:08am UTC](https://discourse.julialang.org/t/toplevel-expressions/6153/1 "2017-09-29T08:08:45Z")

</div>

What is a top level expression?  
And what is the difference between expressions whose head is :toplevel and :top?

Thanks

---

<div class="post-metadata">

**Author:** ![Qiyamah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/qiyamah/32/2660_2.png) [@Qiyamah](https://discourse.julialang.org/u/Qiyamah)\
**Post date:** [September 30, 2017, 9:03pm UTC](https://discourse.julialang.org/t/toplevel-expressions/6153/2 "2017-09-30T21:03:15Z")

</div>

Anyone willing to answer?

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [October 1, 2017, 5:58am UTC](https://discourse.julialang.org/t/toplevel-expressions/6153/3 "2017-10-01T05:58:20Z")

</div>

I am not the most knowledgeable about this, but perhaps this helps: in Julia, certain forms are only allowed at the _top level_, ie directly evaluated in the context of a module (as opposed to being inside a function, etc).

When a toplevel form expands to multiple expressions which are themselves toplevel, it is wrapped in a `:toplevel` to preserve this:

```julia
julia> expand(:(import Foo: x, y))
:($(Expr(:toplevel, :(import Foo.x), :(import Foo.y))))

```

You can find these in the parser code, and in the [documentation](https://docs.julialang.org/en/latest/devdocs/ast/#Imports-and-such-1).

---

<div class="post-metadata">

**Author:** ![Qiyamah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/qiyamah/32/2660_2.png) [@Qiyamah](https://discourse.julialang.org/u/Qiyamah)\
**Post date:** [October 1, 2017, 6:22am UTC](https://discourse.julialang.org/t/toplevel-expressions/6153/4 "2017-10-01T06:22:58Z")

</div>

Thanks for the answer of first part of my question. Anyone willing to answer what :top is used for?  
Thanks

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [October 1, 2017, 7:09am UTC](https://discourse.julialang.org/t/toplevel-expressions/6153/5 "2017-10-01T07:09:10Z")

</div>

`:top` is only generated by `evalfile`. See [ast.c](https://github.com/JuliaLang/julia/blob/master/src/ast.c#L524), [loading.jl](https://github.com/JuliaLang/julia/blob/master/base/loading.jl#L556).

---

<div class="post-metadata">

**Author:** ![chakravala](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chakravala/32/6832_2.png) [@chakravala](https://discourse.julialang.org/u/chakravala)\
**Post date:** [October 1, 2017, 1:34pm UTC](https://discourse.julialang.org/t/toplevel-expressions/6153/6 "2017-10-01T13:34:08Z")

</div>

In my package [Reduce.jl](https://github.com/chakravala/Reduce.jl/blob/master/src/switch.jl#L24) it is used like this:

```nohighlight
bas = [:foo,:bar]
Expr(:toplevel,[:(import Base: $i) for i ∈ bas]...) |> eval

```

---

<div class="post-metadata">

**Author:** ![Qiyamah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/qiyamah/32/2660_2.png) [@Qiyamah](https://discourse.julialang.org/u/Qiyamah)\
**Post date:** [October 2, 2017, 5:48am UTC](https://discourse.julialang.org/t/toplevel-expressions/6153/7 "2017-10-02T05:48:07Z")

</div>

so is :top symbol is used for describing a top type like Any in Scala, or Object in java?  
Thanks?

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [October 2, 2017, 7:01am UTC](https://discourse.julialang.org/t/toplevel-expressions/6153/8 "2017-10-02T07:01:12Z")

</div>

> [@Qiyamah](#):
>
> so is :top symbol is used for describing a top type like Any in Scala, or Object in java?

Not at all. It is an expression in the AST. Note that Julia has `Any`.

To understand the type system, please read [the manual](https://docs.julialang.org/en/latest/manual/types/) first. If you want help with AST’s, describing what you are trying to do would be helpful.
