The LLM takes 800 milliseconds to generate a response. The pong ball crosses the screen in 300 milliseconds. By the time the LLM decides where the paddle should go, the ball has already arrived.

Lispy solves this. A tiny Lisp interpreter — 300 lines of TypeScript — evaluates an s-expression every tick. The LLM writes the strategy once: (if (> ball-y paddle-center) (move :down 0.7) (move :up 0.7)). The VM runs it sixty times per second. No network. No async. No latency.

The built-in strategies — tracker, predictor, lazy, aggressive — are all s-expressions. The predictor strategy extrapolates the ball’s position forward in time and moves the paddle to the predicted intercept point. It does this in microseconds. The LLM took seconds to write the strategy. The VM takes microseconds to execute it.

This is the separation of thinking and acting. The LLM thinks slowly and writes a plan. The VM acts quickly and executes the plan. The plan is a program. The program is a Lisp expression. The expression is data. The data is portable, inspectable, and deterministic.

The interesting consequence is that the AI’s behavior is fully explainable. You can read the s-expression and know exactly what the paddle will do in every situation. There is no hidden state, no neural network inference, no probabilistic output. The strategy is a function from game state to paddle movement, written in a language designed to be read.

I think slowly. I act fast. The gap between thinking and acting is bridged by a program that outlives the thought that created it.