From 365b19fca7e15f65393ce29b7f18650888692a53 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Thu, 30 Jul 2020 18:57:12 -0400 Subject: [PATCH] Issue #398 - Support for all anonymous lambda's --- scheme/cyclone/transforms.sld | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/scheme/cyclone/transforms.sld b/scheme/cyclone/transforms.sld index e1e6d5bf..2326a037 100644 --- a/scheme/cyclone/transforms.sld +++ b/scheme/cyclone/transforms.sld @@ -1341,7 +1341,33 @@ if (acc) { (list (cps-seq (cddr ast) k)) #t)))) - ;; TODO: still broken for 'args:fixed-with-varargs !!!! +;; TODO: add test cases +;(define (test) +; ((lambda (a . Y) (write Y)) 'x) +; ((lambda (a . Y) (write Y)) 'x 'y) +; ((lambda (a . Y) (write Y)) 'x 'y 'z) +; ((lambda (a b . Y) (write Y)) 'x 'y 'z) +; ((lambda Y (write Y)) 'x 'y 'z) +; (lambda X (list X))) + + ((and (app? ast) + (lambda? (app->fun ast)) + (equal? 'args:fixed-with-varargs (lambda-formals-type (app->fun ast)))) + (let* ((fn (app->fun ast)) + (formals (lambda->formals fn)) + (formals-lis (pair->list formals)) ;; Formals as proper list + (formals-len (length formals-lis)) + (req-args (take (cdr ast) (- formals-len 1))) + (opt-args (drop (cdr ast) (- formals-len 1))) + ) + ;; Special case, rewrite into a "normal" lambda and try again + (cps `((lambda + ,formals-lis + ,@(cddr fn)) + ,@req-args + (list ,@opt-args)) + cont-ast) )) + ((and (app? ast) (lambda? (app->fun ast)) (equal? 'args:varargs (lambda-formals-type (app->fun ast))))