2.1 KiB
2.1 KiB
Clojure-Typst: A Clojure-style Lisp for Typst
The Problem
Typst is a modern typesetting system with a nice programming language, but it's not a Lisp. We only like Lisps.
The Vision
Create a Clojure-inspired Lisp that compiles to Typst, bringing:
- S-expression syntax
- Functional programming idioms
- Macros and metaprogramming
- Immutable-first data structures
- REPL-driven development (maybe?)
Open Questions
Syntax & Semantics
- How closely do we follow Clojure syntax?
- What Typst constructs map to Lisp naturally?
- How do we handle Typst's content mode vs code mode distinction?
- Do we support Clojure-style destructuring?
- What about namespaces/modules?
Data Structures
- Vectors
[], maps{}, sets#{}? - How do these map to Typst arrays and dictionaries?
- Lazy sequences - possible in Typst?
Interop
- How do we call Typst functions from our Lisp?
- How do we emit Typst content/markup?
- Can we import Typst packages?
Implementation
- What language for the compiler? (Clojure? Rust? Typst itself?)
- AST representation
- Compilation strategy (source-to-source? interpreter?)
- Error messages and source maps
Typst Features to Leverage
- Functions are first-class
- Has closures
- Pattern matching in function args
- Content as a first-class type
- Scripting mode
#vs content mode
Example Syntax Ideas
; Define a function
(defn greet [name]
(str "Hello, " name "!"))
; Emit typst content
(content
(heading "My Document")
(greet "World"))
; Maybe something like hiccup for content?
[:heading {:level 1} "My Document"]
["Hello, " [:strong "World"] "!"]
Next Steps
- Study Typst's language semantics more deeply
- Identify the minimal viable feature set
- Decide on implementation language
- Build a basic parser for s-expressions
- Implement core special forms (def, fn, let, if, do)
- Add Typst content emission
- Iterate
Resources
Notes
(Add brainstorming notes here)