CLOJURE/CONJ 2026

Smuggling Clojure into Statically Compiled Video Games

Lotus Mundi production artwork

Smuggling Clojure
into Statically Compiled
Video Games

With Silk by Lotus Mundi

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM01 / 72
PRIOR ART · 2016

Let’s play Minecraft/Doom/StarCraft!

iPetitions page: Let’s play Minecraft/Doom/StarCraft! Game Agent AI for Udacity Artificial Intelligence Nanodegree Term 2, 94 signatures, started by James ToltonThe open letter to Udacity CEO Sebastian Thrun proposing the Game Agent AI ProjectClosing of the letter and the December 1, 2016 update

Open letter to Udacity CEO Sebastian Thrun · December 1, 2016 · ipetitions.com/petition/gameagentaind

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM02 / 72

The demos

The demos

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM03 / 72
DEMO · REFLEX AGENT

Silk x Doom

Silk x Doom game artwork
Still from Silk x Doom
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM04 / 72
REFLEX AGENT

Silk x Doom

Silk x Doom game artwork
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM05 / 72
DEMO · GOAL-BASED AGENT

Silk x Project Zomboid

Silk x Project Zomboid game artwork
Still from Silk x Project Zomboid
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM06 / 72
GOAL-BASED AGENT · HTN + PRIORITY TABLE

Silk x Project Zomboid

Silk x Project Zomboid game artwork
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM07 / 72
DEMO · GOAL-BASED AGENT

Silk x Factorio

Silk x Factorio game artwork
Still from Silk x Factorio
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM08 / 72
GOAL-BASED AGENT · RECIPE HTN + GOAL LADDER

Silk x Factorio

Silk x Factorio game artwork
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM09 / 72
DEMO · SEVERAL WORLDS

Silk the Dark Lord

Still from Silk the Dark Lord
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM10 / 72
ONE REPL · SEVERAL WORLDS

Silk the Dark Lord

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM11 / 72

Introducing Silk

Introducing Silk

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM12 / 72
SILK BY LOTUS MUNDI

Any game. Any game engine. Anywhere.

Ariel, the Silk aerialist
Art by Mayteesk
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM13 / 72
PRIOR ART

The Silk Road (part 1)

1989
Nintendo
2014
Peter Norvig
2015
Python
2016
Naga-ette from Chrono Trigger
2017
Lambda symbol for SICP

Bracket

2018
The Dragon Book: Compilers, Principles, Techniques, and Tools
2019
libpython-clj
2020–21
DatomicSciClojAPLxfn
2021
Raft consensus algorithmThe Devil’s Interop
2023
The LLM shoggoth wearing a smiley mask
2024
Paradigms of Artificial Intelligence ProgrammingScryer Prolog
2025
Modern Software EngineeringTrinity Web Prolog spider
2026
Silk by Lotus Mundi
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM14 / 72
FROM THE GIT HISTORY

The Silk Road (part 2)

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM15 / 72
SILK BY LOTUS MUNDI

The Three Pillars

Clojure

CLOJURE

A (love) language

CLOJURE character
SilkOTP

SILK OTP

A composition language

SILK OTP character
Silk tensors

SILK TENSORS

A tensor language

SILK TENSORS character
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM16 / 72
THE LANGUAGE + THE RUNTIME

What did I just see?

SilkSilk
what-architecture.svg
C# logo
C#
Unity IL2CPP logo
Unity IL2CPP
JVM logo
JVM
Clojure logo
Clojure
Lua 5.2–5.4 logo
Lua 5.2–5.4
Project
MyGame/Assets/
├── Scripts/Combat.cs
└── Silk~/game/combat.silk
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM17 / 72
SILK TIER LIST

Currently supported hosts

As of October 2, 2026

S
A
B
C
F
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM18 / 72
HOW SILK ENTERS A SYSTEM

6 Modes of integration

CLI

silk run game/server.silk

Static artifact

silk compile <target> -o <dst>
./<dst>

Embedded evaluator

_vm.Eval("(require 'game.combat)");

Bound function

var damage = _vm.Resolve(
    Sym.Ns("game.combat"),
    Sym.Name("damage"));
damage.Invoke(30L, 10L);

Ports

var output = _vm.OpenPort(
    SilkRT.Kw("t04", "out"));
foreach (var msg in output.Drain())
    Handle(msg);

Distribution peer

silk node --name game@host \
  --cookie demo app.silk
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM19 / 72
BINDING TIME

Three compilation binding times

0
0-SHOT

Interpret / JIT

At evaluation

1
1-SHOT

Sealed / sovereign

One artifact

MANY-SHOT

Delegated toolchain

Unity · downstream builds

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM20 / 72
SILK BY LOTUS MUNDI

Continuous Delivery and Testing

01 · Unit testing

345 suites written for Silk test the language, runtime and standard library with clojure.test: 11,958 assertions, run on every backend. 142 xUnit tests cover the .NET host.

02 · Oracle testing

Silk’s results are compared with those of a reference implementation, namely real Clojure under Babashka and stock Erlang/OTP. J is a second reference for APL questions. A deliberate difference is recorded as a divergence.

03 · Divergent oracle testing

Hosts and backends are checked against each other. A compiled program must reproduce the interpreter’s output exactly, the HLSL that ships is checked against the CPU run, and every tensor run is judged for backend parity.

04 · Property-based testing

OTP invariants are stated as properties and checked on generated inputs, with stock Erlang/OTP as the reference. The suites run continuously.

05 · Fuzz testing

Fuzz scenarios are generated from a seed and can be replayed. A long-running soak process re-runs each failure to confirm it and records the seed that reproduces it. Since June, 756 soak campaigns have run.

06 · Conformance testing

83 suites ported from Clojure’s own test tree run against Silk, and all pass. A test marked as expected to fail that starts passing fails the build until the mark is removed.

07 · Presentation testing

A Scryer Prolog grammar enumerates 93,855 tensor programs from a formal presentation of the language. Each is judged against Dyalog APL, and none fails; no LLM writes or selects cases.

08 · Acceptance testing

Language behavior is first specified as executable acceptance tests in Farley’s four-layer style, before the runtime implements it. A lint fails the build if a host term leaks into the upper layers.

09 · System testing

Every product and application is itself a test: each game, mod, tutorial, IDE integration and manual example. Unity play-mode tests start a real Erlang node and check its output.

10 · Static analysis

Linters and static checks run in the fast gate. silk fmt --check rejects unformatted code, and the editor warns on any definition that cannot run on the strict profile.

428conformance suites
11,958assertions per backend
~94ktensor programs per backend
36CI lanes; a red trunk blocks push
~½ millionchecks per pipeline run (order of magnitude)
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM21 / 72

Five questions

Five questions

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM22 / 72
THE FIVE QUESTIONS

1. How do I get my code “in” to the game??

art/zoolander-imac.jpg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM23 / 72
THE FIVE QUESTIONS

2. O god, what have I done?

Choosing a programming paradigm

Francisco Goya, Saturn Devouring His Son (1819–1823), Museo del Prado
Francisco Goya, Saturn Devouring His Son (1819–1823), Museo del Prado
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM24 / 72
THE FIVE QUESTIONS

3. How do I stop the bleeding?

An immutable language in a mutable world

Jean-Louis-César Lair, The Torture of Prometheus (1819)
Jean-Louis-César Lair, The Torture of Prometheus (1819)
art/loop-tick.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM25 / 72
THE FIVE QUESTIONS

4. What was even the point?

Solving the hardest problem in game systems design

art/a-to-b.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM26 / 72
THE FIVE QUESTIONS

5. You’re asking the wrong question.

How do we keep the wheels from falling off this thing? Also…

art/dost-thou-even-lisp.png
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM27 / 72

1. How do I get my code “in” to the game??

1. How do I get my code “in” to the game??

Into the game loop

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM28 / 72
INTO THE GAME LOOP

Game loop and object lifetime

art/loop-unity.svg
Jay’s low-poly dinosaur with a photo-textured face
Unity

GameObject

MonoBehaviour components

Unreal

AActor

UActorComponent

Godot

Node

Scripts on a node tree

s&box

GameObject

C# components

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM29 / 72
GAME DEVELOPMENT CHALLENGES

Scenes

Reusable modular dungeon pieces arranged separately
Reusable definition
Prefab / Blueprint
Instantiate→
Dungeon pieces assembled into a lit scene
Scene · Objects + state
Instances · A place in the world
Unity scene hierarchy
Unity hierarchy

Unity

Scenes + prefabs

Unreal

Levels + Blueprints

Godot

Nested scenes

s&box

Scenes + prefabs

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM30 / 72
GAMES + THEIR ECOSYSTEMS

Languages and Platforms

Factorio capsule artwork

Factorio

C++ engine · Lua mods

C++Lua
Project Zomboid capsule artwork

Project Zomboid

Java · Kahlua

JavaLua
RimWorld capsule artwork

RimWorld

C# · Unity · Harmony

C#Unity
Stardew Valley capsule artwork

Stardew Valley

C# · MonoGame · SMAPI

C#
Baldur’s Gate 3 capsule artwork

Baldur’s Gate 3

Osiris · Lua via Script Extender

Lua
Doom / ManagedDoom capsule artwork

Doom / ManagedDoom

Original C · C# port

C#
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM31 / 72
VIDEO GAME DEVELOPMENT

The Unity Editor

art/unity-editor.png
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM32 / 72
VIDEO GAME DEVELOPMENT

The loading screen

art/unity-loading.png
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM33 / 72
THE LANGUAGE + THE RUNTIME

The compilation pipeline

SilkSilk
what-architecture.svg
C# logo
C#
Unity IL2CPP logo
Unity IL2CPP
JVM logo
JVM
Clojure logo
Clojure
Lua 5.2–5.4 logo
Lua 5.2–5.4
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM34 / 72

2. O god, what have I done?

2. O god, what have I done?

The WASM model

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM35 / 72
DEFINE IT

Silk in a Unity project

combat.silk
(ns game.combat)
(defn damage [hp amount]
  (- hp amount))
Combat.cs · component members
private ISilkGameVm _vm;
private ISilkFn _damage;

void Awake()
{
    _vm = SilkVm.Attach(
        () => (long)(Time.fixedTime * 1000));
    _vm.Eval("(require 'game.combat)");
    _damage = _vm.Resolve(
        Sym.Ns("game.combat"),
        Sym.Name("damage"));
}

object Attack()
    => _damage.Invoke(30L, 10L); // 20
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM36 / 72
THE WASM MODEL

Interface Definition Language

C# provider
[SilkHostFn("t02.log", "info",
    Doc = "Write to the Unity console.",
    Capability = ":t02/log")]
internal static void Info(string msg)
    => Debug.Log(msg);
Silk caller
(ns t02.app
  (:require [t02.log]))

(defn greeting [] "hello from t02")

(defn hello! []
  (t02.log/info (greeting)))
Lua provider
return function(rt)
  return {
    pack = "course/t02-log",
    provides = {"t02/log"},
    host_fns = {
      ["t02.log/info"] = function(msg)
        print(msg)
      end,
    },
  }
end
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM37 / 72

3. How do I stop the bleeding?

3. How do I stop the bleeding?

???

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM38 / 72
THE FIVE QUESTIONS

3. How do I stop the bleeding?

An immutable language in a mutable world

Jean-Louis-César Lair, The Torture of Prometheus (1819)
Jean-Louis-César Lair, The Torture of Prometheus (1819)
art/loop-tick.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM39 / 72

4. What was even the point?

4. What was even the point?

OTP

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM40 / 72
VIDEO GAMES

The central problem of video games

Going from simple to easy

art/central-problem.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM41 / 72
PLAYER → SKELETON

Direct coupling

PlayerCombat.cs + Skeleton.cs
public sealed class PlayerCombat : MonoBehaviour
{
    [SerializeField] Skeleton target;
    public void Attack() => target.TakeDamage(10);
}

public sealed class Skeleton : MonoBehaviour
{
    [SerializeField] int hitPoints = 30;
    public void TakeDamage(int amount)
    {
        hitPoints -= amount;
        if (hitPoints <= 0) Destroy(gameObject);
    }
}
art/reference-focus.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM42 / 72
TRADITIONAL METHODS

Ways to connect game systems

REFERENCES
  • Direct references
  • Singletons
  • The God Object
  • Game manager
  • Service locator
  • Dependency injection
  • Mediator
CALLBACKS + EVENTS
  • Callbacks
  • Delegates
  • Observer pattern
  • Event bus
  • UnityEvents
  • Godot signals
  • ScriptableObject channels
  • Message queues
STATE + DATA
  • Database (you wish!)
  • “Declarative” state
  • ECS / DOTS
  • Event log / CQRS
  • Event sourcing
  • Blackboards
  • Redux-style stores
  • view = f(data)
CONTROL FLOW
  • State machines
  • Behavior trees
  • Coroutines
  • async / await
  • FRP / Rx streams (RxJS, UniRx)
  • xforms / transducers
  • Command pattern
  • Job system
LANGUAGE TRICKS
  • Frameworks
  • Bespoke engines
  • Macros
  • Generics
  • Multimethods
  • Monads
  • The functional dream
  • etc…

Who owns state, order, and lifetime?

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM43 / 72
GOAL-BASED AGENT · NSGA-II + LAYOUT ENGINE + PATH ROUTER

Languages limit modern game AI

Languages limit modern game AI game artwork
Silk x RimWorld: arbiter, NSGA-II generator, layout engine with path router and wall planner, build planner, supervisor, executor and actuator, all supervised Silk OTP stages inside the game process
Colony Optimizer dashboard: demand radar, convergence, champion base, execution log

Colony Optimizer · Silk × UI Toolkit: demand radar, convergence, champion base, orders in flight

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM44 / 72

Commonality/Variability Analysis

Commonality/Variability Analysis

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM45 / 72
THE PROBLEM DECOMPLECTED · 1

The Angel’s Sandwich

art/sandwich-clean.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM46 / 72
THE PROBLEM DECOMPLECTED · 2

The Devil’s Candycane

art/candy-clean.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM47 / 72
THE PROBLEM DECOMPLECTED · 3

The Devil’s Christmas Tree

art/tree-clean.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM48 / 72
SILK OTP

The CENTRAL problem, revisited

art/central-problem.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM49 / 72
OTP

Erlang inverts the sandwich

art/erlang-inverts.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM50 / 72
SILK OTP

From Christmas Tree to Data Donut

art/donut.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM51 / 72
THE THREE PILLARS

Silk OTP

Clara

○ SILK OTP

A composition language

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM52 / 72
SILK OTP

Inside a Skeleton actor

art/actor-anatomy-skeleton.svg
skeleton.silk
(actor/spawn
  (fn skeleton [ui-manager-pid]
    (loop [state {:hp 30}]
      (let [state (handle state (actor/receive!))]
        (actor/send! ui-manager-pid {:hp (:hp state)})
        (recur state))))
  ui-manager-pid)
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM53 / 72
SILK OTP · GEN_SERVER

The actual OTP protocol

Callbacks · silk.otp.gen → gen · silk.otp.result → r
(defrecord Counter []
  gen/IGenServer
  (gen-init [_ _ [n]] (r/=>Ok n))
  (handle-call [_ _ _ _ n] (r/=>Reply n n))
  (handle-cast [_ _ delta n]
    (r/=>NoReply (+ n delta)))
  (handle-info [_ _ _ n] (r/=>NoReply n))
  (handle-continue [_ _ _ n] (r/=>NoReply n))
  (terminate [_ _ _ _] nil))
Client functions · callers never cast or call directly
;; client API: the only surface a caller sees
(defn start-link [parent n]
  (gen/start-link parent (->Counter) [n]))

(defn add! [counter delta]
  (gen/cast counter delta))

(defn value [counter]
  (gen/call counter :read 3000))

;; a caller
(let [c (start-link parent 40)]
  (add! c 2)
  (value c))        ;; => 42

State in → tagged result out · the client functions do the cast and the call

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM54 / 72
SILK OTP · GEN_STATEM

State + event → transition + actions

IStateMachine callback · silk.otp.statem.result → sr
(handle-event [_ _ _ event state data]
  (case [state event]
    [:saving :destination-ready]
    (sr/=>KeepState data [(sr/=>Postpone)])

    [:saving :source-saved]
    (sr/=>NextState :joining data)

    [:joining :destination-ready]
    (sr/=>NextState :playing data)

    (sr/=>KeepState data)))
Client functions · silk.otp.statem → statem
;; client API over the state machine
(defn start-link [node]
  (statem/start-link node (->Transfer) false []))

(defn destination-ready! [t]
  (gen/cast t :destination-ready))

(defn source-saved! [t]
  (gen/cast t :source-saved))

(defn state [t]
  (gen/call t :read 3000))

;; a caller
(destination-ready! t)   (state t) ;; => :saving
(source-saved! t)        (state t) ;; => :playing

The early :destination-ready is postponed in :saving and replayed after :source-saved

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM55 / 72
SILK OTP · SUPERVISOR

Supervision tree

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM56 / 72
SILK OTP · WHY RESTARTING WORKS

Let it crash

Why restarting works: ease of finding bugs in production. Core feature: repeatable easy, transient hard. Secondary feature: repeatable easy, often overlooked; transient hard.Bugs that happen in production. Core feature: repeatable should never, transient all the time. Secondary feature: repeatable pretty often, transient all the time.Bugs handled by restarts. Core feature: repeatable no, transient yes. Secondary feature: repeatable depends, transient yes.

Fred Hébert, “The Zen of Erlang,” ferd.ca, February 8, 2016 · repeatable = Bohrbugs, transient = Heisenbugs (Jim Gray, 1985)

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM57 / 72
A LANGUAGE THAT FITS THE PROBLEM

Sending messages

actor-messages.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM58 / 72
ADD AN ARROW · ADD A SYSTEM

Changing the message topology

actor-changes.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM59 / 72
CIRCLES + ARROWS

Systemic game design

systemic-graph.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM60 / 72
ERLANG DISTRIBUTION PEER

Actors across machines

epmd-discovery.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM61 / 72

3. How do I stop the bleeding?

3. How do I stop the bleeding?

Ports

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM62 / 72
SILK OTP

The game loop meets Silk OTP

A to B
art/loop-otp.svg
C# · Unity component excerpt
void Awake()
{
    _vm = SilkVm.Attach(
        () => (long)(Time.fixedTime * 1000));
    _out = _vm.OpenPort(SilkRT.Kw("t04", "out"));
    _vm.Resolve(Sym.Ns("t04.app"),
                Sym.Name("start!")).Invoke();
}

void Update()
{
    _vm.StepFor(stepBudgetMs, stepChunkTurns);
    foreach (var msg in _out.Drain())
        HandleGameEffect(msg);
}
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM63 / 72
GAME + HEADLESS TEST

One simulation, two environments

unity-simulation.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM64 / 72
SILK OTP

New methods of storytelling

art/devices.svg
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM65 / 72

5. Do you even Lisp, bro?

5. Do you even Lisp, bro?

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM66 / 72
PRIOR ART · 2025

Language, Weaponized

Modern Software Engineering

Modern Software Engineering by David FarleyContinuous Delivery by Jez Humble and David Farley
Modern Software Engineering YouTube channel

David Farley, Modern Software Engineering (2021) · Humble & Farley, Continuous Delivery (2010) · the MSE channel on YouTube

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM67 / 72
PRIOR ART · 2024

Paradigms of Artificial Intelligence Programming

Book cover: Paradigms of Artificial Intelligence Programming, Case Studies in Common Lisp, Peter Norvig
GitHub norvig/paip-lisp: Lisp code for the textbook Paradigms of Artificial Intelligence ProgrammingThis is an open-source repository for the book Paradigms of Artificial Intelligence Programming by Peter Norvig
PAIP Chapter 5, ELIZA: Dialog with a Machine

Peter Norvig, Paradigms of Artificial Intelligence Programming (1992) · github.com/norvig/paip-lisp

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM68 / 72
PRIOR ART · 2024

The Power of Prolog

The Power of Prolog by Markus Triska, table of contents
GitHub mthom/scryer-prolog: a modern Prolog implementation written mostly in RustScryer Prolog aims to become to ISO Prolog what GHC is to Haskell
GitHub jjtolton/libscryer-clj: Clojure bindings for Scryer Prologlibscryer-clj README: the lisp and prolog epic handshake

Markus Triska, The Power of Prolog · metalevel.at/prolog · youtube.com/@ThePowerOfProlog · Scryer Prolog · libscryer-clj

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM69 / 72
THE THREE PILLARS

Clojure

Lily

♡ CLOJURE

A (love) language

SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM70 / 72
LOTUS MUNDI

What’s next?

Lilinaut in Rider: stopped at a breakpoint in app.silk while Unity is in play modeLilinaut in Rider: stopped at a breakpoint in app.silk inside a built Unity playerSilk Taps: inline results and a value inspector
  • ToolingLilinaut: a Rider debugger for Silk, in Unity play mode and in built players. Taps show inline results.
  • DistributionPackages and binaries.
  • Battle testing
  • DocumentationLanguage, runtime, host APIs.
  • Tutorials
  • Marketing
SILK BY LOTUS MUNDI · CLOJURE/CONJ 2026 · LOTUSMUNDI.COM71 / 72
LOTUS MUNDI

Silk by Lotus Mundi

← → Slides · O Overview · Esc Close