Vibe — A Language for Reasoning Together

3 min read Original article ↗

A programming language where humans and AI reason together about programs.

R7RS Scheme · LLVM bitcode · fully self-hosted

The Problem with “Vibe Coding”

The problem with vibe coding isn’t the vibe — it’s the code.

When you ask a model to generate code in a language that resists clean abstraction, you get code that resists understanding. Not because the model failed, but because the language offers no tools for transparency. The generated code is opaque by nature: you can read it, but you cannot reason about it without re-deriving every implicit assumption the language makes.

Scheme is different. Its macro system makes program structure explicit — any expression can be mechanically expanded to a small set of well-understood primitives. There is no hidden compiler magic, no implicit transformation you have to take on faith. Vibe coding with Scheme is a more powerful experience because the language itself is designed for the kind of transparency that human–AI collaboration demands.

Two Goals

R7RS Small Scheme via macro expansion. Every language feature that can be a macro must be a macro. Only an irreducible set of primitive forms (define, lambda, if, set!, quote, define-syntax) are implemented natively. Everything else expands to those primitives through well-defined, inspectable transformations.

Binding registry with human-language descriptions. Every binding in a Vibe program — every function, variable, macro, and type — is paired with a plain-language description of what it does. An LLM introspects a program by combining macro expansion (to see structure) with registry lookup (to see meaning). No “trust the code” — understand the code.

Together, these goals close the loop: macros make programs structurally transparent; the registry makes them semantically transparent. Structure all the way down, meaning all the way up.

How It Works

  User Programs
  ─────────────────────────────────────
  Standard Library (R7RS 6.x)
  ─────────────────────────────────────
  Derived Forms via Macros
  let, cond, and, or, begin, do, ...
  ─────────────────────────────────────
  Primitive Forms
  define, lambda, if, set!, quote
  ─────────────────────────────────────
  Kernel DSL (llvm:*)
  llvm:define-function, llvm:call, ...
  ─────────────────────────────────────
  LLVM Bitcode
  ─────────────────────────────────────
  Native Machine Code

Each layer is built entirely from the layer below it. The kernel DSL is the trusted core — the only code that must be understood by reading its implementation rather than its expansion. Everything above is transparent by construction.

Current Status

Self-hosted compiler Done Macro system (unhygienic) Partial Kernel rewrite using macros Next Macro system (hygienic) Planned R7RS primitive forms Not started R7RS derived forms Not started Standard library Not started Binding registry Not started

Resources