lua: multi-return + unpack at call sites (+10 tests)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
This commit is contained in:
@@ -190,9 +190,13 @@
|
||||
(list
|
||||
(make-symbol "define")
|
||||
(make-symbol (first names))
|
||||
(if (> (len exps) 0) (lua-tx (first exps)) nil)))
|
||||
(else
|
||||
(cons (make-symbol "begin") (lua-tx-local-pairs names exps 0)))))))
|
||||
(if
|
||||
(> (len exps) 0)
|
||||
(list (make-symbol "lua-first") (lua-tx (first exps)))
|
||||
nil)))
|
||||
((= (len exps) 0)
|
||||
(cons (make-symbol "begin") (lua-tx-local-pairs names exps 0)))
|
||||
(else (lua-tx-multi-local names exps))))))
|
||||
|
||||
(define
|
||||
lua-tx-local-pairs
|
||||
@@ -216,9 +220,12 @@
|
||||
((lhss (nth node 1)) (rhss (nth node 2)))
|
||||
(cond
|
||||
((= (len lhss) 1)
|
||||
(lua-tx-single-assign (first lhss) (lua-tx (first rhss))))
|
||||
(else
|
||||
(cons (make-symbol "begin") (lua-tx-assign-pairs lhss rhss 0)))))))
|
||||
(lua-tx-single-assign
|
||||
(first lhss)
|
||||
(list (make-symbol "lua-first") (lua-tx (first rhss)))))
|
||||
((= (len rhss) 0)
|
||||
(cons (make-symbol "begin") (lua-tx-assign-pairs lhss rhss 0)))
|
||||
(else (lua-tx-multi-assign lhss rhss))))))
|
||||
|
||||
(define
|
||||
lua-tx-assign-pairs
|
||||
@@ -399,7 +406,10 @@
|
||||
(cond
|
||||
((= (len exps) 0) nil)
|
||||
((= (len exps) 1) (lua-tx (first exps)))
|
||||
(else (cons (make-symbol "list") (map lua-tx exps)))))))
|
||||
(else
|
||||
(list
|
||||
(make-symbol "lua-pack-return")
|
||||
(cons (make-symbol "list") (lua-tx-multi-args exps 0))))))))
|
||||
|
||||
(define
|
||||
lua-tx-local-function
|
||||
@@ -434,3 +444,91 @@
|
||||
(define
|
||||
lua-eval-ast
|
||||
(fn (src) (let ((sx (lua-transpile src))) (eval-expr sx))))
|
||||
|
||||
(define
|
||||
lua-tx-multi-args
|
||||
(fn
|
||||
(exps i)
|
||||
(cond
|
||||
((>= i (len exps)) (list))
|
||||
((= i (- (len exps) 1))
|
||||
(cons (lua-tx (nth exps i)) (lua-tx-multi-args exps (+ i 1))))
|
||||
(else
|
||||
(cons
|
||||
(list (make-symbol "lua-first") (lua-tx (nth exps i)))
|
||||
(lua-tx-multi-args exps (+ i 1)))))))
|
||||
|
||||
(define
|
||||
lua-tx-multi-rhs
|
||||
(fn
|
||||
(exps)
|
||||
(list
|
||||
(make-symbol "lua-pack-return")
|
||||
(cons (make-symbol "list") (lua-tx-multi-args exps 0)))))
|
||||
|
||||
(define
|
||||
lua-tx-multi-local
|
||||
(fn
|
||||
(names exps)
|
||||
(let
|
||||
((tmp (make-symbol "__rets")))
|
||||
(cons
|
||||
(make-symbol "begin")
|
||||
(append
|
||||
(lua-tx-multi-local-decls names 0)
|
||||
(list
|
||||
(list
|
||||
(make-symbol "let")
|
||||
(list (list tmp (lua-tx-multi-rhs exps)))
|
||||
(cons
|
||||
(make-symbol "begin")
|
||||
(lua-tx-multi-local-sets names tmp 0)))))))))
|
||||
|
||||
(define
|
||||
lua-tx-multi-local-decls
|
||||
(fn
|
||||
(names i)
|
||||
(if
|
||||
(>= i (len names))
|
||||
(list)
|
||||
(cons
|
||||
(list (make-symbol "define") (make-symbol (nth names i)) nil)
|
||||
(lua-tx-multi-local-decls names (+ i 1))))))
|
||||
|
||||
(define
|
||||
lua-tx-multi-local-sets
|
||||
(fn
|
||||
(names tmp i)
|
||||
(if
|
||||
(>= i (len names))
|
||||
(list)
|
||||
(cons
|
||||
(list
|
||||
(make-symbol "set!")
|
||||
(make-symbol (nth names i))
|
||||
(list (make-symbol "lua-nth-ret") tmp i))
|
||||
(lua-tx-multi-local-sets names tmp (+ i 1))))))
|
||||
|
||||
(define
|
||||
lua-tx-multi-assign
|
||||
(fn
|
||||
(lhss rhss)
|
||||
(let
|
||||
((tmp (make-symbol "__rets")))
|
||||
(list
|
||||
(make-symbol "let")
|
||||
(list (list tmp (lua-tx-multi-rhs rhss)))
|
||||
(cons (make-symbol "begin") (lua-tx-multi-assign-pairs lhss tmp 0))))))
|
||||
|
||||
(define
|
||||
lua-tx-multi-assign-pairs
|
||||
(fn
|
||||
(lhss tmp i)
|
||||
(if
|
||||
(>= i (len lhss))
|
||||
(list)
|
||||
(cons
|
||||
(lua-tx-single-assign
|
||||
(nth lhss i)
|
||||
(list (make-symbol "lua-nth-ret") tmp i))
|
||||
(lua-tx-multi-assign-pairs lhss tmp (+ i 1))))))
|
||||
|
||||
Reference in New Issue
Block a user