(defvar *indent* "")
(defun gen-atom (output atom)
(princ atom output))
(defun gen-print (output expr)
(princ *indent* output)
(princ "put " output)
(translate-expression expr output))
(defun gen-loop-for-to (output var from to body)
(princ *indent* output)
(princ "do " output)
(translate-expression var output)
(princ " = " output)
(translate-expression from output)
(princ " to " output)
(translate-expression to output)
(princ ";" output)
(terpri output)
(let ((*indent* (concatenate 'string " " *indent*)))
(dolist (form body)
(translate-expression form output)
(princ ";" output)
(terpri output)))
(princ *indent* output)
(princ "end" output))
(defun translate-expression (form output)
(cond
((atom form)
(gen-atom output form))
((and (eq 'loop (first form))
(eq 'for (second form))
(symbolp (third form))
(eq 'from (fourth form))
(eq 'to (sixth form))
(eq 'do (eighth form)))
(let ((var (third form))
(from (fifth form))
(to (seventh form))
(body (nthcdr 8 form)))
(gen-loop-for-to output var from to body)))
((eq 'print (first form))
(gen-print output (second form)))
(t
(error "Unknown form ~S" form))))
(defun gen-program (output form)
(princ "data _null_;" output)
(terpri output)
(let ((*indent* (concatenate 'string " " *indent*)))
(translate-expression form output)
(princ ";" output)
(terpri output))
(princ "run;" output)
(terpri output))
(defun translate-program (form output)
(gen-program output form))
cl-user> (translate-program '(loop for i from 1 to 10 do (print i)) *standard-output*)
data _null_;
do i = 1 to 10;
put i;
end;
run;
nil
cl-user>
--
__Pascal Bourguignon__
http://www.informatimago.com/
A bad day in () is better than a good day in {}.