- *newline*
- (let ((svar (third keyarg)))
- (when svar
- (code (translate-variable svar) " = " (ls-compile t) ";" *newline*)))
- "break;" *newline*)
- "}" *newline*)
- "}" *newline*
- ;; Default value
- "if (i == nargs){" *newline*
- (indent (translate-variable (cadr (car keyarg))) " = " (ls-compile (cadr keyarg)) ";" *newline*)
- "}" *newline*)))
- (when keyword-arguments
- (code "var i;" *newline*
- (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*
- (indent "if ("
- (join (mapcar (lambda (x)
- (concat "arguments[i+2] !== " (ls-compile (caar x))))
- keyword-arguments)
- " && ")
- ")" *newline*
- (indent
- "throw 'Unknown keyword argument ' + xstring(arguments[i].name);" *newline*))
- "}" *newline*)))))
+
+ ,(let ((svar (third keyarg)))
+ (when svar
+ `(code ,(translate-variable svar) " = " ,(ls-compile t) ";" )))
+ "break;" )
+ "}" )
+ "}"
+ ;; Default value
+ "if (i == nargs){"
+ (code ,(translate-variable (cadr (car keyarg)))
+ " = "
+ ,(ls-compile (cadr keyarg))
+ ";" )
+ "}" )))
+ (when keyword-arguments
+ `(code "var i;"
+ ,@(mapcar #'parse-keyword keyword-arguments))))
+ ;; Check for unknown keywords
+ ,(when keyword-arguments
+ `(code "var start = " ,(+ n-required-arguments n-optional-arguments) ";"
+ "if ((nargs - start) % 2 == 1){"
+ (code "throw 'Odd number of keyword arguments';" )
+ "}"
+ "for (i = start; i<nargs; i+=2){"
+ (code "if ("
+ ,(interleave (mapcar (lambda (x)
+ `(code "arguments[i+2] !== " ,(ls-compile (caar x))))
+ keyword-arguments)
+ " && ")
+ ")"
+ (code
+ "throw 'Unknown keyword argument ' + xstring(arguments[i+2].name);" ))
+ "}" )))))