Merge branch 'master' of git://github.com/Ferada/jscl into keyword-arg-fixes
authorDavid Vázquez <davazp@gmail.com>
Sat, 15 Jun 2013 16:34:41 +0000 (18:34 +0200)
committerDavid Vázquez <davazp@gmail.com>
Sat, 15 Jun 2013 16:34:41 +0000 (18:34 +0200)
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.

1  2 
src/compiler.lisp

diff --combined src/compiler.lisp
                 (mapconcat #'parse-keyword keyword-arguments))))
       ;; Check for unknown keywords
       (when keyword-arguments
-        (code "for (i=" (+ n-required-arguments n-optional-arguments)
-              "; i<nargs; i+=2){" *newline*
+        (code "var start = " (+ n-required-arguments n-optional-arguments) ";" *newline*
+              "if ((nargs - start) % 2 == 1){" *newline*
+              (indent "throw 'Odd number of keyword arguments';" *newline*)
+              "}" *newline*
+              "for (i = start; i<nargs; i+=2){" *newline*
               (indent "if ("
                       (join (mapcar (lambda (x)
                                       (concat "arguments[i+2] !== " (ls-compile (caar x))))
                             " && ")
                       ")" *newline*
                       (indent
-                       "throw 'Unknown keyword argument ' + xstring(arguments[i].name);" *newline*))
+                       "throw 'Unknown keyword argument ' + xstring(arguments[i+2].name);" *newline*))
               "}" *newline*)))))
  
  (defun parse-lambda-list (ll)
                    ",")
              ")")))
  
 +(define-compilation macrolet (definitions &rest body)
 +  (let ((*environment* (copy-lexenv *environment*)))
 +    (dolist (def definitions)
 +      (destructuring-bind (name lambda-list &body body) def
 +        (let ((binding (make-binding :name name :type 'macro :value
 +                                     (let ((g!form (gensym)))
 +                                       `(lambda (,g!form)
 +                                          (destructuring-bind ,lambda-list ,g!form
 +                                            ,@body))))))
 +          (push-to-lexenv binding  *environment* 'function))))
 +    (ls-compile `(progn ,@body) *multiple-value-p*)))
 +
 +
  (defun special-variable-p (x)
    (and (claimp x 'variable 'special) t))