1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//! Tatara-lisp authoring layer for engawa render graphs.
//!
//! Operators write effect declarations in a `.tlisp` file:
//!
//! ```text
//! (defmaterial scanlines
//! (shader (inline "..."))
//! (bindings
//! (binding 0 uniform "frame")
//! (binding 1 texture "scene")
//! (binding 2 sampler "scene-sampler")))
//!
//! (defresource swap external)
//! (defresource scene (texture 800 600))
//! (defresource post (texture 800 600))
//!
//! (defgraph mado-pipeline
//! (input swap)
//! (output post)
//! (node clear-scene (kind clear) (output scene))
//! (node scanlines-pass (kind fullscreen-effect)
//! (material scanlines)
//! (input scene)
//! (output post)))
//! ```
//!
//! …and this crate parses + lowers to `engawa::RenderGraph`.
//! Pairs with shikumi's notify watcher for live hot-reload —
//! save the `.tlisp`, the graph rebuilds, the dispatcher picks
//! up the new topology without a restart.
//!
//! ## Why a custom lisp parser
//!
//! The full `tatara-lisp` macro engine is heavy. For engawa's
//! IR — which is intentionally small (8 types) — a minimal
//! sexpr parser + typed lowering does the job in ~600 LOC.
//! When the tatara-lisp ecosystem stabilises (caixa-author
//! lands, the macro engine becomes reusable across consumers),
//! engawa-lisp migrates to lean on it.
//!
//! Today: round-trip-tested sexpr parser, every parse error
//! carries operator-friendly context (line:col + the form being
//! parsed), 30+ unit tests.
pub use ;
pub use ;
pub use ;
/// One-call helper: parse a `.tlisp` source string, lower to an
/// `engawa::RenderGraph`. Returns the graph ready for compile;
/// the caller chains `.compile()` to get a `CompiledGraph` for
/// dispatch.