projects
/
jscl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
IF can return multiple values
[jscl.git]
/
ecmalisp.lisp
diff --git
a/ecmalisp.lisp
b/ecmalisp.lisp
index
17dd213
..
0d091a6
100644
(file)
--- a/
ecmalisp.lisp
+++ b/
ecmalisp.lisp
@@
-1107,8
+1107,8
@@
(define-compilation if (condition true false)
(concat "(" (ls-compile condition) " !== " (ls-compile nil)
(define-compilation if (condition true false)
(concat "(" (ls-compile condition) " !== " (ls-compile nil)
- " ? " (ls-compile true)
- " : " (ls-compile false)
+ " ? " (ls-compile true *multiple-value-p*)
+ " : " (ls-compile false *multiple-value-p*)
")"))
(defvar *lambda-list-keywords* '(&optional &rest))
")"))
(defvar *lambda-list-keywords* '(&optional &rest))
@@
-1568,15
+1568,22
@@
(let ((func (ls-compile func-form)))
(js!selfcall
"var args = [values];" *newline*
(let ((func (ls-compile func-form)))
(js!selfcall
"var args = [values];" *newline*
- "function values(){" *newline*
+ "values = function(){" *newline*
(indent "var result = [];" *newline*
(indent "var result = [];" *newline*
+ "result['multiple-value'] = true;" *newline*
"for (var i=0; i<arguments.length; i++)" *newline*
"for (var i=0; i<arguments.length; i++)" *newline*
- (indent "result.push(arguments[i]);"))
+ (indent "result.push(arguments[i]);" *newline*)
+ "return result;" *newline*)
"}" *newline*
"}" *newline*
+ "var vs;" *newline*
(mapconcat (lambda (form)
(mapconcat (lambda (form)
- (ls-compile form))
+ (concat "vs = " (ls-compile form t) ";" *newline*
+ "if (typeof vs === 'object' && 'multiple-value' in vs)" *newline*
+ (indent "args = args.concat(vs);" *newline*)
+ "else" *newline*
+ (indent "args.push(vs);" *newline*)))
forms)
forms)
- "return (" func ").apply(window, [args]);")))
+ "return (" func ").apply(window, args);" *newline*)))