home *** CD-ROM | disk | FTP | other *** search
- ;--- super if macro
- ; This macro allow the following forms:
- ; (If a then b) ==> (cond (a b))
- ; (If a thenret) ==> (cond (a))
- ; (If a then b else c) ==> (cond (a b) (t c))
- ; (If a then b b2 ==> (cond (a b b2) (c d d2) (t e))
- ; elseif c then d d2
- ; else e)
- ;
- ;
- (defun If macro (lis)
- (prog (majlis minlis revl)
- (do ((revl (reverse lis) (cdr revl)))
- ((null revl))
- (cond ((eq (car revl) 'else)
- (setq majlis `((t ,@minlis) ,@majlis)
- minlis nil))
- ((or (eq (car revl) 'then) (eq (car revl) 'thenret))
- (setq revl (cdr revl)
- majlis `((,(car revl) ,@minlis) ,@majlis)
- minlis nil))
- ((eq (car revl) 'elseif))
- ((eq (car revl) 'If)
- (setq majlis `(cond ,@majlis)))
- (t (setq minlis `( ,(car revl) ,@minlis)))))
- ; we displace the previous macro, that is we actually replace
- ; the if list structure with the corresponding cond, meaning
- ; that the expansion is done only once
- (rplaca lis (car majlis))
- (rplacd lis (cdr majlis))
- (return majlis)))
-
- ;--- msg : print a message consisting of strings and values
-