X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler.lisp;h=866cea2f1bf4305a8911f792a41e7a20b0fbd9bd;hb=18c8e6a2d7bdc53f5a95c1a29b8913ee66a415d6;hp=08291449c373d4284148b225ec295da612c06fe8;hpb=008edd3627c0cc149280b9143a18bb7cea3c0918;p=jscl.git diff --git a/src/compiler.lisp b/src/compiler.lisp index 0829144..866cea2 100644 --- a/src/compiler.lisp +++ b/src/compiler.lisp @@ -228,7 +228,7 @@ (flet ((canonicalize (keyarg) ;; Build a canonical keyword argument descriptor, filling ;; the optional fields. The result is a list of the form - ;; ((keyword-name var) init-form). + ;; ((keyword-name var) init-form svar). (let ((arg (ensure-list keyarg))) (cons (if (listp (car arg)) (car arg) @@ -280,13 +280,14 @@ ,@(with-collect (dotimes (idx n-optional-arguments) (let ((arg (nth idx optional-arguments))) - (collect `(,(+ idx n-required-arguments) - (= ,(make-symbol (translate-variable (car arg))) - ,(ls-compile (cadr arg))) - ,(when (third arg) - `(= ,(make-symbol (translate-variable (third arg))) - ,(ls-compile nil))))))) - (collect `(default (break)))))))) + (collect `(case ,(+ idx n-required-arguments))) + (collect `(= ,(make-symbol (translate-variable (car arg))) + ,(ls-compile (cadr arg)))) + (collect (when (third arg) + `(= ,(make-symbol (translate-variable (third arg))) + ,(ls-compile nil)))))) + (collect 'default) + (collect '(break))))))) (defun compile-lambda-rest (ll) (let ((n-required-arguments (length (ll-required-arguments ll))) @@ -310,55 +311,62 @@ (length (ll-optional-arguments ll))) (keyword-arguments (ll-keyword-arguments-canonical ll))) - `(code - ;; Declare variables - ,@(mapcar (lambda (arg) - (let ((var (second (car arg)))) - `(code "var " ,(translate-variable var) "; " - ,(when (third arg) - `(code "var " ,(translate-variable (third arg)) - " = " ,(ls-compile nil) - ";" ))))) - keyword-arguments) - ;; Parse keywords - ,(flet ((parse-keyword (keyarg) - ;; ((keyword-name var) init-form) - `(code "for (i=" ,(+ n-required-arguments n-optional-arguments) - "; i