IronKernel

A Kernel programming language for the CLR — where combiners and environments are first-class, and It runs on .NET.

Why Kernel?

Scheme gave us lambdas. Kernel goes further: the operative vau receives unevaluated operand trees and the caller’s environment. New syntax is just library code — no macro expander required.

Operatives, not macros

Build unless, and?, or a tracer that prints source before it runs — by choosing what to eval, when, and where.

First-class environments

Environments are values. Import bindings, redirect evaluation, or script remote-eval across modules without leaving the language.

Lives on the CLR

Call into .NET with ., new, and .get. Hybrid compile to Expression trees; full Kernel semantics kept via a trampolined CPS runtime.

Tagged effects & async

Unforgeable prompt tags, deep handlers with one-shot resume, and await-task for CLR Tasks — without leaving Kernel evaluation.

Capability profiles

Run as minimal, safe (reviewed CLR wrappers), or unrestricted. Authority rides with environments, not copied bindings.

Projects on NuGet

.ikproj projects, the ik CLI, locked restores, and packages that ship IronKernel source alongside CLR assemblies.

Taste of the language

Define control forms that short-circuit — something a plain lambda cannot do without thunks.

vau invents unless

(define unless
  (vau (test & body) env
    (if (eval test env)
      #inert
      (eval (cons sequence body) env))))

(unless #f
  (. System.Console WriteLine "fires only when test is false"))

delimited continuations

(reset
  (begin
    (shift (lambda (k) (cons 1 (k (#inert)))))
    (shift (lambda (k) (cons 2 (k (#inert)))))
    ()))
; ⇒ (1 2)

tagged effect handler

(define request (make-prompt-tag))
(prompt request
  (lambda (value k) (resume k (+ value 1)))
  (+ 1 (perform request 40)))
; ⇒ 42

Continue in the guided tour →

ironkernel.org

The name’s Iron prefix means It runs on .NET. The site lives at ironkernel.org (the .net TLD was already taken — fitting irony for a CLR language).