Operatives, not macros
Build unless, and?, or a tracer that prints source before it runs —
by choosing what to eval, when, and where.
A Kernel programming language for the CLR — where combiners and environments are first-class, and It runs on .NET.
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.
Build unless, and?, or a tracer that prints source before it runs —
by choosing what to eval, when, and where.
Environments are values. Import bindings, redirect evaluation, or script remote-eval across modules without leaving the language.
Call into .NET with ., new, and .get. Hybrid compile to
Expression trees; full Kernel semantics kept via a trampolined CPS runtime.
Unforgeable prompt tags, deep handlers with one-shot resume, and
await-task for CLR Tasks — without leaving Kernel evaluation.
Run as minimal, safe (reviewed CLR wrappers), or
unrestricted. Authority rides with environments, not copied bindings.
.ikproj projects, the ik CLI, locked restores, and packages that
ship IronKernel source alongside CLR assemblies.
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
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).