Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

a toy translator

77 views
Skip to first unread message

Francogrex

unread,
Jul 1, 2012, 7:24:55 PM7/1/12
to
A toy translator from lisp to another language. For example what would be the lisp program that would take this lisp code:

(loop for i from 1 to 10 do (print i))

and translate it into that target code:

data _null_;
do i = 1 to 10;
put i;
end;
run;

Pascal J. Bourguignon

unread,
Jul 1, 2012, 7:58:32 PM7/1/12
to
(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 {}.
0 new messages