# Programmatically defining new modules

**URL:** <https://discourse.julialang.org/t/programmatically-defining-new-modules/20297>\
**Category:** New to Julia\
**Created:** [January 30, 2019, 11:17pm UTC](https://discourse.julialang.org/t/programmatically-defining-new-modules/20297 "2019-01-30T23:17:46Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![ablaom](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ablaom/32/4889_2.png) [@ablaom](https://discourse.julialang.org/u/ablaom)\
**Post date:** [January 30, 2019, 11:17pm UTC](https://discourse.julialang.org/t/programmatically-defining-new-modules/20297/1 "2019-01-30T23:17:46Z")

</div>

Is it not possible to programatically define modules?

My naive attempt fails:

```julia
julia> quote module Junk end end
quote
    #= REPL[38]:1 =#
    module Junk
    #= REPL[38]:1 =#
    #= REPL[38]:1 =#
    end
end

julia> eval(ans)
ERROR: syntax: "module" expression not at top level
Stacktrace:
 [1] eval at ./boot.jl:319 [inlined]
 [2] eval(::Expr) at ./client.jl:393
 [3] top-level scope at none:0

```

---

<div class="post-metadata">

**Author:** ![Gnimuc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gnimuc/32/2194_2.png) [@Gnimuc](https://discourse.julialang.org/u/Gnimuc)\
**Post date:** [January 30, 2019, 11:48pm UTC](https://discourse.julialang.org/t/programmatically-defining-new-modules/20297/2 "2019-01-30T23:48:00Z")

</div>

you could use ‘Module’ constructor and then eval Exprs in it.

---

<div class="post-metadata">

**Author:** ![xiaodai](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/xiaodai/32/15937_2.png) [@xiaodai](https://discourse.julialang.org/u/xiaodai)\
**Post date:** [January 30, 2019, 11:48pm UTC](https://discourse.julialang.org/t/programmatically-defining-new-modules/20297/3 "2019-01-30T23:48:37Z")

</div>

Maybe you need to “escape” the `module` definition in the quote. Just guessing

---

<div class="post-metadata">

**Author:** ![Simon\_Bolland](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/simon_bolland/32/8920_2.png) [@Simon\_Bolland](https://discourse.julialang.org/u/Simon_Bolland)\
**Post date:** [January 31, 2019, 12:35am UTC](https://discourse.julialang.org/t/programmatically-defining-new-modules/20297/4 "2019-01-31T00:35:53Z")

</div>

It seems to work using `:( ... ) ` rather than quote

```julia
julia> names(Main)
4-element Array{Symbol,1}:
 :Base
 :Core
 :InteractiveUtils
 :Main

julia> for n in ["Tom", "Dick", "Harry"]
           println(n)
           eval(:(module $(Symbol(n)) test()="Testing $($n)" end))
       end
Tom
Dick
Harry

julia> names(Main)
8-element Array{Symbol,1}:
 :Base
 :Core
 :Dick
 :Harry
 :InteractiveUtils
 :Main
 :Tom
 :ans

julia> Dick.test()
"Testing Dick"

julia> Harry.test()
"Testing Harry"

julia> Tom.test()
"Testing Tom"

```
