X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=lispstrack.lisp;h=44be5a684255dfc8ce5aabd8865507e85d54e197;hb=2af650b83b1449de72dc7b8209cb2310cdea0509;hp=00ccb1de498408416ce0e38d8cd25e34246c583d;hpb=c0ec137f00c9eed5ce87c63b875afc7bb02d8c09;p=jscl.git diff --git a/lispstrack.lisp b/lispstrack.lisp index 00ccb1d..44be5a6 100644 --- a/lispstrack.lisp +++ b/lispstrack.lisp @@ -6,6 +6,9 @@ ((not ,condition)) ,@body)) +(defvar *newline* " +") + ;;; simplify me, please (defun concat (&rest strs) (reduce (lambda (s1 s2) (concatenate 'string s1 s2)) @@ -24,6 +27,11 @@ separator (join (cdr list) separator))))) +(defun join-trailing (list separator) + (if (null list) + "" + (concat (car list) separator (join-trailing (cdr list) separator)))) + (defun integer-to-string (x) (if (zerop x) "0" @@ -168,11 +176,11 @@ (defvar *compilations* nil) (defun ls-compile-block (sexps env fenv) - (concat (join (mapcar (lambda (x) - (concat (ls-compile x env fenv) ";")) - sexps) - "; -"))) + (join-trailing (mapcar (lambda (x) + (ls-compile x env fenv)) + sexps) + "; +")) (defun extend-env (args env) (append (mapcar #'make-var-binding args) env)) @@ -201,6 +209,8 @@ `(push (list ',name (lambda (env fenv ,@args) ,@body)) *compilations*)) +(defvar *toplevel-compilations*) + (define-compilation if (condition true false) (concat "(" (ls-compile condition env fenv) @@ -227,19 +237,19 @@ (join (mapcar (lambda (x) (lookup-variable x new-env)) required-arguments) ",") - "){ -" + "){" + *newline* (if rest-argument (concat "var " (lookup-variable rest-argument new-env) " = arguments.slice(" - (prin1-to-string (length required-arguments)) "); -") + (prin1-to-string (length required-arguments)) + ");" + *newline*) "") - (concat (ls-compile-block (butlast body) new-env fenv) "return " (ls-compile (car (last body)) new-env fenv) ";") - " -})")))) + *newline* + "})")))) (define-compilation fsetq (var val) (concat (lookup-function var fenv) @@ -254,8 +264,6 @@ ;;; Literals -(defvar *literals* '()) - (defun literal->js (sexp) (cond ((null sexp) "undefined") @@ -270,7 +278,7 @@ (let ((counter 0)) (defun literal (form) (let ((var (concat "l" (integer-to-string (incf counter))))) - (push (cons var (literal->js form)) *literals*) + (push (concat "var " var " = " (literal->js form)) *toplevel-compilations*) var))) (define-compilation quote (sexp) @@ -299,11 +307,8 @@ (defvar *eval-when-compilations*) (define-compilation eval-when-compile (&rest body) - (setq *eval-when-compilations* "") (eval (cons 'progn body)) - (if (string= *eval-when-compilations* "") - nil - *eval-when-compilations*)) + nil) (defmacro define-transformation (name args form) `(define-compilation ,name ,args @@ -383,20 +388,13 @@ (define-compilation code-char (x) (concat "String.fromCharCode( " (ls-compile x env fenv) ")")) - -(defmacro with-eval-when-compilation (&body body) - `(setq *eval-when-compilations* - (concat *eval-when-compilations* (progn ,@body)))) - (defun %compile-defvar (name) (push (make-var-binding name) *env*) - (with-eval-when-compilation - (concat "var " (lookup-variable name *env*)))) + (push (concat "var " (lookup-variable name *env*)) *toplevel-compilations*)) (defun %compile-defun (name) (push (make-func-binding name) *fenv*) - (with-eval-when-compilation - (concat "var " (lookup-variable name *fenv*)))) + (push (concat "var " (lookup-variable name *fenv*)) *toplevel-compilations*)) (defun %compile-defmacro (name lambda) (push (cons name (cons 'macro lambda)) *fenv*)) @@ -436,16 +434,14 @@ (compile-funcall (car sexp) (cdr sexp) env fenv))))))) (defun ls-compile-toplevel (sexp) - (setq *literals* nil) + (setq *toplevel-compilations* nil) (let ((code (ls-compile sexp))) (prog1 - (concat (join (mapcar (lambda (lit) - (concat "var " (car lit) " = " (cdr lit) "; -")) - *literals*) + (concat (join (mapcar (lambda (x) (concat x ";" *newline*)) + *toplevel-compilations*) "") code) - (setq *literals* nil)))) + (setq *toplevel-compilations* nil)))) #+common-lisp (defun ls-compile-file (filename output)