X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=lispstrack.lisp;h=c352d71f92abd73b3f21caa19032eb1d579a23fb;hb=2b563a52d35859c1519c05bf97465093876b151c;hp=d463be5c900c59d64c03930e8cd352cc1e61a2a1;hpb=467386b7ff2f1da406760f72d4bb9b3de4cd56cb;p=jscl.git diff --git a/lispstrack.lisp b/lispstrack.lisp index d463be5..c352d71 100644 --- a/lispstrack.lisp +++ b/lispstrack.lisp @@ -6,10 +6,24 @@ strs :initial-value "")) + +(let ((counter 0)) + (defun make-binding (symbol) + (cons symbol (format nil "V_~d" (incf counter))))) + ;;; Compiler (defvar *compilations* nil) +(defun extend-env (args env) + (append (mapcar #'make-binding args) env)) + +(defun ls-lookup (symbol env) + (let ((binding (assoc symbol env))) + (if binding + (format nil "~a" (cdr binding)) + (error "Undefined variable `~a'" symbol)))) + (defmacro define-compilation (name args &body body) "creates a new primitive `name' with parameters args and @body. The body can access to the local environment through the variable env" @@ -23,28 +37,34 @@ body can access to the local environment through the variable env" (ls-compile false env))) (define-compilation lambda (args &rest body) - (concat "(function (" - (format nil "~{V_~a~^, ~}" args) - "){ " - (ls-compile-block body (extend-env args env)) - "}) -")) + (let ((new-env (extend-env args env))) + (concat "(function (" + (format nil "~{~a~^, ~}" (mapcar + (lambda (x) (ls-lookup x new-env)) + args)) + "){ " + (ls-compile-block body new-env) + "}) +"))) -(defun extend-env (args env) - (append (mapcar #'list args) env)) +(define-compilation setq (var val) + (format nil "~a = ~a" (ls-lookup var env) (ls-compile val env))) + +(define-compilation quote (sexp) + (cond + ((integerp sexp) (format nil "~a" sexp)) + ((stringp sexp) (format nil "\"~a\"" sexp)) + ((listp sexp) (format nil "[~{~a~^, ~}]" sexp)))) (defparameter *env* '()) (defparameter *env-fun* '()) - (defun ls-compile (sexp &optional env) (cond - ((symbolp sexp) (if (assoc sexp env) - (format nil "V_~a" sexp) - (error "Undefined variable `~a'" sexp))) - ((integerp sexp) (format nil " ~a " sexp)) + ((symbolp sexp) (ls-lookup sexp env)) + ((integerp sexp) (format nil "~a" sexp)) ((stringp sexp) (format nil " \"~a\" " sexp)) - ; list + ; list ((listp sexp) (let ((compiler-func (second (assoc (car sexp) *compilations*)))) (if compiler-func