Constructing Kernel's $if
Tue 16 Aug 2011 20:17 EDT
John Shutt’s PhD
thesis
introduces the Kernel programming language. Kernel includes an $if
,
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 lambda
to
postpone evaluation; Kernel’s evaluation of forms is explicit, and
we use eval
to cause evaluation.
Expressions used as tests absolutely must evaluate to true
or
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.