Contract lambda first in a lambda application

Try to prevent timing issues that occur when the application is contracted first, and arguments can be removed too early.
This commit is contained in:
Justin Ethier 2016-05-23 22:29:48 -04:00
parent 3dc541c99b
commit 58bc782022

View file

@ -317,10 +317,11 @@
,(opt:contract (if->else exp))))
; Application:
((app? exp)
(let* ((fnc (opt:contract (car exp))))
(cond
((and (ast:lambda? (car exp))
(list? (ast:lambda-args (car exp))) ;; Avoid optional/extra args
(= (length (ast:lambda-args (car exp)))
((and (ast:lambda? fnc)
(list? (ast:lambda-args fnc)) ;; Avoid optional/extra args
(= (length (ast:lambda-args fnc))
(length (app->args exp))))
(let ((new-params '())
(new-args '())
@ -336,21 +337,23 @@
(set! new-args (cons (car args) new-args))
(set! new-params (cons param new-params))))
(set! args (cdr args))))
(ast:lambda-args (car exp)))
;(trace:error `(DEBUG contract args ,(app->args exp)
(ast:lambda-args fnc))
;(trace:e rror `(DEBUG contract args ,(app->args exp)
; new-args ,new-args
; params ,(ast:lambda-args (car exp))
; params ,(ast:lambda-args fnc)
; new-params ,new-params))
(map
opt:contract
(cons
(ast:%make-lambda
(ast:lambda-id (car exp))
(ast:lambda-id fnc)
(reverse new-params)
(ast:lambda-body (car exp)))
(ast:lambda-body fnc))
(map
opt:contract
(reverse new-args)))))
(else
(map (lambda (e) (opt:contract e)) exp))))
(cons
fnc
(map (lambda (e) (opt:contract e)) (cdr exp)))))))
(else
(error "CPS optimize [1] - Unknown expression" exp))))