John Shutt’s PhD
introduces the Kernel programming language. Kernel includes an
which is treated as a built-in primitive.
It doesn’t have to be primitive, though: in Kernel a construct that
does the same thing as the primitive
$if operation (in well-typed
programs) can be constructed.
In Scheme, one needs to make use of the macro facility to construct an
if if there’s not one built-in:
(define true (lambda (first second) first)) (define false (lambda (first second) second)) (define-syntax if (syntax-rules () ((_ test if-true if-false) ((test (lambda () if-true) (lambda () if-false))))))
In Kernel, we use fexprs instead:
($define! true ($lambda (first second) first)) ($define! false ($lambda (first second) second)) ($define! $if ($vau (test if-true if-false) env (eval ((eval test env) if-true if-false) env)))
Here we can see the central opposition between Scheme and Kernel:
Scheme’s evaluation of forms is implicit, and we use
postpone evaluation; Kernel’s evaluation of forms is explicit, and
eval to cause evaluation.
Expressions used as tests absolutely must evaluate to
false, and nothing else, for these definitions to work. One of the
benefits of treating
$if as primitive is that one can provide for a
separation between Booleans and the rest of the universe that’s not
possible otherwise. It’s nice to know, though, that
$if can be
dispensed with if necessary.