mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-14 08:17:35 +02:00
Convert anonymous pure vars
Express these functions using a "regular" lambda since the arguments are well-known. This prevents issues further downstream and should generate faster code as well.
This commit is contained in:
parent
ff04774330
commit
2a6ba9bee4
1 changed files with 24 additions and 18 deletions
|
@ -1341,6 +1341,18 @@ if (acc) {
|
||||||
(list (cps-seq (cddr ast) k))
|
(list (cps-seq (cddr ast) k))
|
||||||
#t))))
|
#t))))
|
||||||
|
|
||||||
|
;; TODO: still broken for 'args:fixed-with-varargs !!!!
|
||||||
|
((and (app? ast)
|
||||||
|
(lambda? (app->fun ast))
|
||||||
|
(equal? 'args:varargs (lambda-formals-type (app->fun ast))))
|
||||||
|
(let ((fn (app->fun ast)))
|
||||||
|
;; Special case, rewrite into a "normal" lambda and try again
|
||||||
|
(cps `((lambda
|
||||||
|
(,(cadr fn))
|
||||||
|
,@(cddr fn))
|
||||||
|
(list ,@(cdr ast)))
|
||||||
|
cont-ast) ))
|
||||||
|
|
||||||
((app? ast)
|
((app? ast)
|
||||||
;; Syntax check the function
|
;; Syntax check the function
|
||||||
(if (const? (car ast))
|
(if (const? (car ast))
|
||||||
|
@ -1351,7 +1363,8 @@ if (acc) {
|
||||||
((lambda? fn)
|
((lambda? fn)
|
||||||
;; Check number of arguments to the lambda
|
;; Check number of arguments to the lambda
|
||||||
(let ((lam-min-num-args (lambda-num-args fn))
|
(let ((lam-min-num-args (lambda-num-args fn))
|
||||||
(num-args (length (app->args ast))))
|
(num-args (length (app->args ast)))
|
||||||
|
(ltype (lambda-formals-type fn)))
|
||||||
(cond
|
(cond
|
||||||
((< num-args lam-min-num-args)
|
((< num-args lam-min-num-args)
|
||||||
(error
|
(error
|
||||||
|
@ -1364,7 +1377,7 @@ if (acc) {
|
||||||
":")
|
":")
|
||||||
fn))
|
fn))
|
||||||
((and (> num-args lam-min-num-args)
|
((and (> num-args lam-min-num-args)
|
||||||
(equal? 'args:fixed (lambda-formals-type fn)))
|
(equal? 'args:fixed ltype))
|
||||||
(error
|
(error
|
||||||
(string-append
|
(string-append
|
||||||
"Too many arguments passed to anonymous lambda. "
|
"Too many arguments passed to anonymous lambda. "
|
||||||
|
@ -1373,22 +1386,15 @@ if (acc) {
|
||||||
" but received "
|
" but received "
|
||||||
(number->string num-args)
|
(number->string num-args)
|
||||||
":")
|
":")
|
||||||
fn))
|
fn)))
|
||||||
))
|
;; Do conversion
|
||||||
;; Do conversion
|
(cps-list (app->args ast)
|
||||||
(cps-list (app->args ast)
|
(lambda (vals)
|
||||||
(lambda (vals)
|
(cons (ast:make-lambda
|
||||||
(let ((code
|
(lambda->formals fn)
|
||||||
(cons (ast:make-lambda
|
(list (cps-seq (cddr fn) ;(ast-subx fn)
|
||||||
(lambda->formals fn)
|
cont-ast)))
|
||||||
(list (cps-seq (cddr fn) ;(ast-subx fn)
|
vals)))))
|
||||||
cont-ast)))
|
|
||||||
vals)))
|
|
||||||
(cond
|
|
||||||
((equal? (lambda-formals-type fn) 'args:varargs)
|
|
||||||
(cons 'Cyc-list code)) ;; Manually build up list
|
|
||||||
(else
|
|
||||||
code))))))
|
|
||||||
(else
|
(else
|
||||||
(cps-list ast ;(ast-subx ast)
|
(cps-list ast ;(ast-subx ast)
|
||||||
(lambda (args)
|
(lambda (args)
|
||||||
|
|
Loading…
Add table
Reference in a new issue