X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=lispstrack.lisp;h=883d25efeb19de1264a29dddd35fec850692ba39;hb=1d3ea0158e2e12e5296d1e8816ec3fb5c76173d2;hp=705c089c63e4f7da39b376799e74d63c9ad772f8;hpb=b41e94b86a1eda01fe890971025e9a36a32b0707;p=jscl.git diff --git a/lispstrack.lisp b/lispstrack.lisp index 705c089..883d25e 100644 --- a/lispstrack.lisp +++ b/lispstrack.lisp @@ -77,18 +77,36 @@ (ls-compile true env fenv) (ls-compile false env fenv))) -(define-compilation lambda (args &rest body) - (let ((new-env (extend-env args env))) - (concat "(function (" - (join (mapcar (lambda (x) (lookup-variable x new-env)) - args) - ",") - "){ +;;; Return the required args of a lambda list +(defun lambda-list-required-argument (lambda-list) + (if (or (null lambda-list) (eq (car lambda-list) '&rest)) + nil + (cons (car lambda-list) (lambda-list-required-argument (cdr lambda-list))))) + +(defun lambda-list-rest-argument (lambda-list) + (second (member '&rest lambda-list))) + +(define-compilation lambda (lambda-list &rest body) + (let ((required-arguments (lambda-list-required-argument lambda-list)) + (rest-argument (lambda-list-rest-argument lambda-list))) + (let ((new-env (extend-env (cons rest-argument required-arguments) env))) + (concat "(function (" + (join (mapcar (lambda (x) (lookup-variable x new-env)) + required-arguments) + ",") + "){ " - (concat (ls-compile-block (butlast body) env fenv) - "return " (ls-compile (car (last body)) env fenv) ";") - " -})"))) + (if rest-argument + (concat "var " (lookup-variable rest-argument new-env) + " = arguments.slice(" + (prin1-to-string (length required-arguments)) "); +") + "") + + (concat (ls-compile-block (butlast body) new-env fenv) + "return " (ls-compile (car (last body)) new-env fenv) ";") + " +})")))) (define-compilation fsetq (var val) (format nil "~a = ~a" (lookup-function var fenv) (ls-compile val env fenv)))