X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=lispstrack.lisp;h=4aa57bc815f6c2a930b7657c7fa0f9aa795d0f83;hb=d0b80709a9000bc3208c806b7f57c727b3610d22;hp=234750aa1f941c78968dfab0325fa73e6ef56ff2;hpb=d9ea3b1c765af784880b5cdfd28b48e521716478;p=jscl.git diff --git a/lispstrack.lisp b/lispstrack.lisp index 234750a..4aa57bc 100644 --- a/lispstrack.lisp +++ b/lispstrack.lisp @@ -1,5 +1,6 @@ ;;; Utils +#+common-lisp (defmacro while (condition &body body) `(do () ((not ,condition)) @@ -67,7 +68,7 @@ (setq ch (%peek-char stream))))) (defun terminalp (ch) - (or (null ch) (whitespacep ch) (char= #\) ch))) + (or (null ch) (whitespacep ch) (char= #\) ch) (char= #\( ch))) (defun read-until (stream func) (let ((string "") @@ -133,7 +134,17 @@ (%read-char stream) (ecase (%read-char stream) (#\' - (list 'function (ls-read stream))))) + (list 'function (ls-read stream))) + (#\+ + (let ((feature (read-until stream #'terminalp))) + (cond + ((string= feature "common-lisp") + (ls-read stream);ignore + (ls-read stream)) + ((string= feature "lispstrack") + (ls-read stream)) + (t + (error "Unknown reader form."))))))) (t (let ((string (read-until stream #'terminalp))) (if (every #'digit-char-p string) @@ -190,6 +201,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) @@ -243,8 +256,6 @@ ;;; Literals -(defvar *literals* '()) - (defun literal->js (sexp) (cond ((null sexp) "undefined") @@ -259,7 +270,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) @@ -288,11 +299,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 @@ -372,20 +380,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*)) @@ -425,17 +426,17 @@ (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) "; + (concat (join (mapcar (lambda (x)(concat x "; ")) - *literals*) + *toplevel-compilations*) "") code) - (setq *literals* nil)))) + (setq *toplevel-compilations* nil)))) +#+common-lisp (defun ls-compile-file (filename output) (with-open-file (in filename) (with-open-file (out output :direction :output :if-exists :supersede) @@ -445,7 +446,6 @@ for compilation = (ls-compile-toplevel x) when compilation do (write-line (concat compilation "; ") out))))) - ;;; Testing (defun compile-test () (ls-compile-file "test.lisp" "test.js"))