X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=lispstrack.lisp;h=b4adc1b2cc442fa7e4ee8c3ce9674b9c202d2aeb;hb=3eb043e814a43ce8fcb12e4121225ad484f00671;hp=59e1c855891d6925a62552a5febd73127f13105e;hpb=1f7914504ed7424902f66d1760c413ef39ac6f1e;p=jscl.git diff --git a/lispstrack.lisp b/lispstrack.lisp index 59e1c85..b4adc1b 100644 --- a/lispstrack.lisp +++ b/lispstrack.lisp @@ -500,7 +500,7 @@ (compile-bool (concat "(" (ls-compile x env fenv) "===" (ls-compile nil env fenv) ")"))) (define-compilation cons (x y) - (concat "{car: " (ls-compile x env fenv) ", cdr: " (ls-compile y env fenv) "}")) + (concat "({car: " (ls-compile x env fenv) ", cdr: " (ls-compile y env fenv) "})")) (define-compilation consp (x) (compile-bool @@ -509,10 +509,16 @@ "; return (typeof tmp == 'object' && 'car' in tmp);})()"))) (define-compilation car (x) - (concat "(" (ls-compile x env fenv) ").car")) + (concat "(function () { var tmp = " (ls-compile x env fenv) + "; return tmp === " (ls-compile nil nil nil) "? " + (ls-compile nil nil nil) + ": tmp.car; })()")) (define-compilation cdr (x) - (concat "(" (ls-compile x env fenv) ").cdr")) + (concat "(function () { var tmp = " (ls-compile x env fenv) + "; return tmp === " (ls-compile nil nil nil) "? " + (ls-compile nil nil nil) + ": tmp.cdr; })()")) (define-compilation setcar (x new) (concat "((" (ls-compile x env fenv) ").car = " (ls-compile new env fenv) ")")) @@ -630,11 +636,12 @@ (and (symbolp x) (eq (binding-type (lookup-function x *fenv*)) 'macro))) (defun ls-macroexpand-1 (form env fenv) - (when (macrop (car form)) - (let ((binding (lookup-function (car form) *env*))) - (if (eq (binding-type binding) 'macro) - (apply (eval (binding-translation binding)) (cdr form)) - form)))) + (if (macrop (car form)) + (let ((binding (lookup-function (car form) *env*))) + (if (eq (binding-type binding) 'macro) + (apply (eval (binding-translation binding)) (cdr form)) + form)) + form)) (defun compile-funcall (function args env fenv) (cond