# \[ANN\] Terse.jl

**URL:** https://discourse.julialang.org/t/ann-terse-jl/136410
**Category:** Package Announcements
**Created:** [March 26, 2026, 2:49pm UTC](https://discourse.julialang.org/t/ann-terse-jl/136410 "2026-03-26T14:49:12Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![joshday](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joshday/32/368_2.png) [@joshday](https://discourse.julialang.org/u/joshday)
#### Post date: [March 26, 2026, 2:49pm UTC](https://discourse.julialang.org/t/ann-terse-jl/136410/1 "2026-03-26T14:49:12Z")

</div>

Hi all,

Announcing [Terse.jl](https://github.com/RallypointOne/Terse.jl) (release pending in General)!

I found myself wanting a succinct syntax for building complex type hierarchies for two reasons: 1) working on complex hierarchies myself, and 2) understanding quickly how Claude code is approaching a problem (It also saves you a few precious tokens in your 1M context window).

You can probably immediately guess what the following creates:

```julia-auto
using Terse

@types Shape > (
    TwoDimensional > (
        Circle(radius::Float64 = 1.0),
        Rectangle(width::Float64 = 1.0, height::Float64 = 1.0),
        Triangle(base::Float64, height::Float64)
    ),
    @mutable ThreeDimensional > (
        Sphere(@const(radius::Float64); hollow::Bool = false),
        Cube(@const(side::Float64); hollow::Bool = false),
        Prism > (
            TriangularPrism(base::Float64, height::Float64),
            Cylinder(radius::Float64 = 1.0; height::Float64 = 1.0)
        )
    )
)

```

Check it out and let me know what you think!

---

<div class="post-metadata">

### Author: ![adienes](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adienes/32/37459_2.png) [@adienes](https://discourse.julialang.org/u/adienes)
#### Post date: [March 26, 2026, 2:50pm UTC](https://discourse.julialang.org/t/ann-terse-jl/136410/2 "2026-03-26T14:50:51Z")

</div>

cool!

I wonder why you chose `@mutable` and `@const` when those are already reserved keywords, and you’re parsing them inside a macro already ? (`@types`)

---

<div class="post-metadata">

### Author: ![joshday](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joshday/32/368_2.png) [@joshday](https://discourse.julialang.org/u/joshday)
#### Post date: [March 26, 2026, 2:52pm UTC](https://discourse.julialang.org/t/ann-terse-jl/136410/3 "2026-03-26T14:52:35Z")

</div>

The “macros” (don’t actually exist, but used within the `@types` macro) are my solution for creating a valid Julia expression:

```julia-auto
julia> :(MyType(const field::FieldType))
ERROR: ParseError:
# Error @ REPL[35]:1:10
:(MyType(const field::FieldType))
# └────────────────────┘ ── expected assignment after `const`
Stacktrace:
 [1] top-level scope
   @ REPL:1

```
