# Getting name from "name"

**URL:** <https://discourse.julialang.org/t/getting-name-from-name/66893>\
**Category:** New to Julia\
**Tags:** metaprogramming\
**Created:** [August 24, 2021, 4:47am UTC](https://discourse.julialang.org/t/getting-name-from-name/66893 "2021-08-24T04:47:31Z")\
**Posts on this page:** 14\
**Page:** 2

<div class="post-metadata">

**Author:** ![rayegun](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rayegun/32/26729_2.png) [@rayegun](https://discourse.julialang.org/u/rayegun)\
**Post date:** [August 24, 2021, 8:12pm UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/21 "2021-08-24T20:12:30Z")

</div>

> Be aware that OP is _not_ asking about parsing julia code. `eval` and `Meta.parse` will NOT be of help here. They’re trying to create their own programming language. Please don’t confuse the two.

Originally I was thinking you might want to use `eval` down the line _after_ parsing and creating some Julia Expr. But now that I think about it you can probably avoid it entirely: parse the input language → execute functions. Maybe if you have structs and such you might want it as a near term solution.

---

<div class="post-metadata">

**Author:** ![dgpdx](https://avatars.discourse-cdn.com/v4/letter/d/45deac/32.png) [@dgpdx](https://discourse.julialang.org/u/dgpdx)\
**Post date:** [August 24, 2021, 8:18pm UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/22 "2021-08-24T20:18:40Z")

</div>

Thanks for the suggestion!

---

<div class="post-metadata">

**Author:** ![rayegun](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rayegun/32/26729_2.png) [@rayegun](https://discourse.julialang.org/u/rayegun)\
**Post date:** [August 24, 2021, 8:21pm UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/23 "2021-08-24T20:21:41Z")

</div>

For Julia take a look at [shashi/APL.jl (github.com)](https://github.com/shashi/APL.jl). It’s not a common language, but it might be helpful.

---

<div class="post-metadata">

**Author:** ![dgpdx](https://avatars.discourse-cdn.com/v4/letter/d/45deac/32.png) [@dgpdx](https://discourse.julialang.org/u/dgpdx)\
**Post date:** [August 24, 2021, 8:21pm UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/24 "2021-08-24T20:21:43Z")

</div>

It is fun! If you’d like, I can send you the source code and documentation for your suggestions for improvement.

---

<div class="post-metadata">

**Author:** ![rayegun](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rayegun/32/26729_2.png) [@rayegun](https://discourse.julialang.org/u/rayegun)\
**Post date:** [August 24, 2021, 8:25pm UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/25 "2021-08-24T20:25:59Z")

</div>

I’m certainly no expert, but I’d be happy to look and try it out! Any extra eyeballs on the code is always so helpful for me personally.

---

<div class="post-metadata">

**Author:** ![dgpdx](https://avatars.discourse-cdn.com/v4/letter/d/45deac/32.png) [@dgpdx](https://discourse.julialang.org/u/dgpdx)\
**Post date:** [August 24, 2021, 8:34pm UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/26 "2021-08-24T20:34:12Z")

</div>

OK, here it is:

(Attachment jacl.txt is missing)

(Attachment jacl.jl is missing)

---

<div class="post-metadata">

**Author:** ![dgpdx](https://avatars.discourse-cdn.com/v4/letter/d/45deac/32.png) [@dgpdx](https://discourse.julialang.org/u/dgpdx)\
**Post date:** [August 24, 2021, 8:35pm UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/27 "2021-08-24T20:35:21Z")

</div>

I’ll need your email address to send to you personally.

---

<div class="post-metadata">

**Author:** ![rayegun](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rayegun/32/26729_2.png) [@rayegun](https://discourse.julialang.org/u/rayegun)\
**Post date:** [August 24, 2021, 8:44pm UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/28 "2021-08-24T20:44:08Z")

</div>

DM’ed

---

<div class="post-metadata">

**Author:** ![Sukera](https://avatars.discourse-cdn.com/v4/letter/s/ce7236/32.png) [@Sukera](https://discourse.julialang.org/u/Sukera)\
**Post date:** [August 24, 2021, 9:54pm UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/29 "2021-08-24T21:54:29Z")

</div>

> [@rayegun](#):
>
> Originally I was thinking you might want to use `eval` down the line _after_ parsing and creating some Julia Expr. But now that I think about it you can probably avoid it entirely: parse the input language → execute functions. Maybe if you have structs and such you might want it as a near term solution.

Again - you are confusing “parsing julia code” with " creating a _new programming language_ that is not julia". Parsing text into julia code will not help you towards parsing non-julia code into a non-julia runtime and executing the result.

---

<div class="post-metadata">

**Author:** ![genkuroki](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/genkuroki/32/18030_2.png) [@genkuroki](https://discourse.julialang.org/u/genkuroki)\
**Post date:** [August 24, 2021, 11:19pm UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/30 "2021-08-24T23:19:51Z")

</div>

> [@dgpdx](#):
>
> I’m implementing a new language in Julia

My language in just 10 lines 😜 (Just have fun! [Jupyter notebook](https://github.com/genkuroki/public/blob/main/0017/tupp%20-%20tiny%20TUPle%20Processor.ipynb))

```julia
t2j(s) = s
function t2j(s::Tuple)
    a = (:block, :if, :tuple, :parameters, :kw, :quote, :(=), :(.=), :.)
    s[1] in a && return Expr(s[1], t2j.(s[2:end])...)
    s[1] === :lambda && return Expr(:(->), Expr(:tuple, s[2]...), t2j(s[3]))
    s[1] === :for && return Expr(s[1], Expr(:(=), t2j(s[2]), t2j(s[3])), t2j(s[4]))
    s[1] === :using && return Expr(s[1], Expr.(:., s[2:end])...)
    Expr(:call, t2j.(s)...)
end
macro tupp(x) t2j(Core.eval( __module__ , x)) end

```

I left all the trouble to Julia! (The name `tupp` might stand for “TUPle Processor”.)

Example 1: for loop and if statement

```julia
@tupp (:for, :k, (:(:), 1, 5),
    (:if, (:iseven, :k),
        (:println, "even: ", :k),
        (:println, "odd: ", :k)))

```

Output:

```julia
odd: 1
even: 2
odd: 3
even: 4
odd: 5

```

Example2: Fibonacci numbers with U-combinator

```julia
@tupp (:block,
    (:(=), :U, (:lambda, (:u,), (:u, :u))),
    (:(=), :F, (:lambda, (:u,), (:lambda, (:n, :a, :b),
                (:if, (:(==), :n, 0), :a,
                    ((:u, :u), (:-, :n, 1), :b, (:+, :a, :b)))))),
    (:(=), :Fib, (:U, :F)),
    (:for, :k, (:(:), 1, 10),
        (:println, "Fib(", :k, ") = ", (:Fib, :k, 0, 1))))

```

Output:

```julia
Fib(1) = 1
Fib(2) = 1
Fib(3) = 2
Fib(4) = 3
Fib(5) = 5
Fib(6) = 8
Fib(7) = 13
Fib(8) = 21
Fib(9) = 34
Fib(10) = 55

```

`t2j` (tupp to Julia) exmaple:

```julia
(:block,
    (:(=), :U, (:lambda, (:u,), (:u, :u))),
    (:(=), :F, (:lambda, (:u,), (:lambda, (:n, :a, :b),
                (:if, (:(==), :n, 0), :a,
                    ((:u, :u), (:-, :n, 1), :b, (:+, :a, :b)))))),
    (:(=), :Fib, (:U, :F)),
    (:for, :k, (:(:), 1, 10),
        (:println, "Fib(", :k, ") = ", (:Fib, :k, 0, 1)))) |> t2j

```

Output:

```julia
quote
    U = ((u,)->u(u))
    F = ((u,)->((n, a, b)->if n == 0
                    a
                else
                    (u(u))(n - 1, b, a + b)
                end))
    Fib = U(F)
    for k = 1:10
        println("Fib(", k, ") = ", Fib(k, 0, 1))
    end
end

```

Example 3: Polynomial regression of y = \sin(\pi x)

```julia
@tupp (:block,
    (:using, :Plots),
    (:(=), :n, 20),
    (:(=), :x, (:range, 0, 2, (:kw, :length, :n))),
    (:(=), :y, (:+, (:., :sinpi, (:tuple, :x)), (:*, 0.2, (:randn, :n)))),
    (:(=), :xs, (:range, 0, 2, (:kw, :length, 200))),
    (:(=), :X, (:.^, :x, (:transpose, (:(:), 0, 3)))),
    (:(=), :b, (:\, :X, :y)),
    (:scatter, :x, :y, (:kw, :label, "sample")),
    (:plot!, :xs, (:., :sinpi, (:tuple, :xs)),
        (:kw, :label, "sinpi(x)"),
        (:kw, :color, (:quote, :black)),
        (:kw, :ls, (:quote, :dash))),
    (:plot!, :xs, (:., :evalpoly, (:tuple, :xs, (:Ref, :b))),
        (:kw, :label, "degree-3 polynomial"),
        (:kw, :color, 2), (:kw, :lw, 2)))

```

 ![2021-08-25](https://global.discourse-cdn.com/julialang/original/3X/b/1/b13c3303dad79101f15f25a55cf4bac2bcd138a6.png)

---

<div class="post-metadata">

**Author:** ![dgpdx](https://avatars.discourse-cdn.com/v4/letter/d/45deac/32.png) [@dgpdx](https://discourse.julialang.org/u/dgpdx)\
**Post date:** [August 25, 2021, 12:17am UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/31 "2021-08-25T00:17:11Z")

</div>

Thanks for this! I can use your examples.

---

<div class="post-metadata">

**Author:** ![genkuroki](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/genkuroki/32/18030_2.png) [@genkuroki](https://discourse.julialang.org/u/genkuroki)\
**Post date:** [August 25, 2021, 10:12am UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/32 "2021-08-25T10:12:47Z")

</div>

The symbol `:name` can be created from the string `"name"` with `Symbol("name")`.

[https://docs.julialang.org/en/v1/base/base/#Core.Symbol-Tuple](https://docs.julialang.org/en/v1/base/base/#Core.Symbol-Tuple)

[https://docs.julialang.org/en/v1/manual/metaprogramming/#Symbols](https://docs.julialang.org/en/v1/manual/metaprogramming/#Symbols)

In general, you rarely need `Meta.parse`, and if you want to use `Meta.parse`, you’re probably thinking about something wrong. For example, instead of `Meta.parse("1 + 1")` you can use `:(1 + 1)` or `Expr(:+, 1, 1)`.

---

<div class="post-metadata">

**Author:** ![rayegun](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rayegun/32/26729_2.png) [@rayegun](https://discourse.julialang.org/u/rayegun)\
**Post date:** [August 26, 2021, 1:36am UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/33 "2021-08-26T01:36:13Z")

</div>

No I’m not. I’m thinking of a quick method to implement a new language, whereby you parse your new language and essentially transpile to Julia Exprs. Such a language could look like anything, although Julia’s semantics could leak pretty easily into it.

---

<div class="post-metadata">

**Author:** ![dgpdx](https://avatars.discourse-cdn.com/v4/letter/d/45deac/32.png) [@dgpdx](https://discourse.julialang.org/u/dgpdx)\
**Post date:** [August 26, 2021, 1:49am UTC](https://discourse.julialang.org/t/getting-name-from-name/66893/34 "2021-08-26T01:49:29Z")

</div>

If you’ve looked at jacl.jl, you’ve noticed I write Julia like a C programmer. C is what I know well 😉  
I would appreciate any suggestions for improvement.

[Previous page](https://discourse.julialang.org/t/getting-name-from-name/66893.md?page=1)
