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.