Subject: Re: special forms.
From: Erik Naggum <erik@naggum.net>
Date: Wed, 18 Jul 2001 18:53:53 GMT
Newsgroups: comp.lang.lisp
Message-ID: <3204471231889910@naggum.net>
* Geoff Summerhayes
> How about:
>
> (defun my-if (test then else)
> (or (and test then)
> (and (not test) else)))
How about figuring out a way that does not involve the IF special
operator?
The above boolean waste simply translates to this in at least one code
walker:
(let ((#:g66 (if (not test) (progn nil) (if t (progn then) nil))))
(if #:g66 #:g66 (if t (progn (if (not (not test)) (progn nil) (if t (progn else) nil))) nil)))
But it can be optimized into only _three_ ifs, instead of the original
one. This is impressing. Somebody should use this to demonstrate the
power of Lisp macros or something. But since we already accept to have
an if that the compiler knows about, the function if can simply be written
(defun if (condition consequent alternate)
(if condition consequent alternate))
However, if we pass lambda forms to if instead of expressions, this might
actually work pretty nicely, even throwing in the ability to access the
value of the condition for free:
(setf (getf 'nil 'boolean-index) 0)
(setf (getf 't 'boolean-index) 1)
(defun if (condition consequent alternate)
(funcall (nth (getf (not condition) 'boolean-index) (list consequent alternate))
condition))
When actually implemented, the boolean-index thing would naturally be
handled more efficiently, and nth would probably use a hardware repeat
instruction so we would not need hardware support for conditional
branching at all. That would be _so_ nice. We can now do away with if.
Or, _Scheme_ can do away with if now that it is proven to be possible to
implement this not-at-all-primitive with some _real_ primitives. That I
basically reinvented the computed goto from Fortran badly should not make
anyone feel particularly ashamed, should it?
In other words: Enough already.
#:Erik
--
There is nothing in this message that under normal circumstances should
cause Barry Margolin to announce his moral superiority over others, but
one never knows how he needs to behave to maintain his belief in it.