34 lines
1.2 KiB
Common Lisp
34 lines
1.2 KiB
Common Lisp
;--- 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
|