X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=lispstrack.lisp;h=7bb69452c0521fee1feef8b69837cafb17f7e819;hb=303beabd731556a15a88141af6e84808c8ed425f;hp=d6c850df67bf8abb21d318e45c6bdc517489038a;hpb=1f4ae1183098cb793ad02b8aa08301f59488d28a;p=jscl.git diff --git a/lispstrack.lisp b/lispstrack.lisp index d6c850d..7bb6945 100644 --- a/lispstrack.lisp +++ b/lispstrack.lisp @@ -1,55 +1,3 @@ -#+lispstrack -(progn - (eval-when-compile - (%compile-defmacro 'defmacro - (lambda (name args &rest body) - `(eval-when-compile - (%compile-defmacro ',name (lambda ,args ,@body)))))) - - (defmacro defvar (name value) - `(progn - (eval-when-compile - (%compile-defvar ',name)) - (setq ,name ,value))) - - (defmacro defun (name args &rest body) - `(progn - (eval-when-compile - (%compile-defun ',name)) - (fsetq ,name (lambda ,args ,@body)))) - - (defun = (x y) (= x y)) - (defun + (x y) (+ x y)) - (defun - (x y) (- x y)) - (defun * (x y) (* x y)) - (defun / (x y) (/ x y)) - (defun 1+ (x) (+ x 1)) - (defun 1- (x) (- x 1)) - (defun cons (x y ) (cons x y)) - (defun car (x) (car x)) - (defun cdr (x) (cdr x)) - - (defun append (list1 list2) - (if (null list1) - list2 - (cons (car list1) - (append (cdr list1) list2)))) - - (defun reverse-aux (list acc) - (if (null list) - acc - (reverse-aux (cdr list) (cons (car list) acc)))) - - (defun reverse (list) - (reverse-aux list '())) - - (defun mapcar (func list) - (if (null list) - '() - (cons (funcall func (car list)) - (mapcar func (cdr list)))))) - - (defun !reduce (func list initial) (if (null list) initial @@ -61,18 +9,15 @@ #+common-lisp (progn - (defmacro while (condition &body body) `(do () ((not ,condition)) ,@body)) - #+common-lisp (defun concat-two (s1 s2) (concatenate 'string s1 s2))) -(defvar *newline* " -") +(defvar *newline* (string (code-char 10))) (defun concat (&rest strs) (!reduce (lambda (s1 s2) (concat-two s1 s2)) @@ -304,10 +249,12 @@ "){" *newline* (if rest-argument - (concat "var " (lookup-variable rest-argument new-env) - " = arguments.slice(" - (prin1-to-string (length required-arguments)) - ");" + (concat "var " (lookup-variable rest-argument new-env) ";" *newline* + "for (var i = arguments.length-1; i>=" + (integer-to-string (length required-arguments)) + "; i--)" *newline* + (lookup-variable rest-argument new-env) " = " + "{car: arguments[i], cdr: " (lookup-variable rest-argument new-env) "};" *newline*) "") (concat (ls-compile-block (butlast body) new-env fenv) @@ -438,6 +385,12 @@ (define-compilation = (x y) (concat "((" (ls-compile x env fenv) ") == (" (ls-compile y env fenv) "))")) +(define-compilation mod (x y) + (concat "((" (ls-compile x env fenv) ") % (" (ls-compile y env fenv) "))")) + +(define-compilation floor (x) + (concat "(Math.floor(" (ls-compile x env fenv) "))")) + (define-compilation null (x) (concat "(" (ls-compile x env fenv) "== undefined)")) @@ -450,16 +403,16 @@ (define-compilation cdr (x) (concat "(" (ls-compile x env fenv) ").cdr")) +(define-compilation make-symbol (name) + (concat "{name: " (ls-compile name env fenv) "}")) + (define-compilation symbol-name (x) (concat "(" (ls-compile x env fenv) ").name")) (define-compilation eq (x y) (concat "(" (ls-compile x env fenv) " === " (ls-compile y env fenv) ")")) -(define-compilation eql (x y) - (concat "(" (ls-compile x env fenv) " == " (ls-compile y env fenv) ")")) - -(define-compilation code-char (x) +(define-compilation string (x) (concat "String.fromCharCode( " (ls-compile x env fenv) ")")) (define-compilation char (string index) @@ -486,6 +439,20 @@ ", ") ")")) +(define-compilation new () + "{}") + +(define-compilation get (object key) + (concat "(" (ls-compile object env fenv) ")[" (ls-compile key env fenv) "]")) + +(define-compilation set (object key value) + (concat "((" + (ls-compile object env fenv) + ")[" + (ls-compile key env fenv) "]" + " = " (ls-compile value env fenv) ")")) + + (defun %compile-defvar (name) (push (make-var-binding name) *env*) (push (concat "var " (lookup-variable name *env*)) *toplevel-compilations*))