Andy Wingo <wi...@pobox.com> skribis: > +;;; Commentary: > +;;; > +;;; A pass to adapt expressions to the arities of their continuations, > +;;; and to rewrite some tail expressions as primcalls to "return". > +;;; > +;;; Code:
[...] > + (define (adapt-exp nvals k exp) > + (match nvals > + (0 > + (rewrite-cps-term (lookup-cont k conts) > + (($ $ktail) > + ,(let-gensyms (kvoid kunspec unspec) > + (build-cps-term > + ($letk* ((kunspec #f ($kargs (unspec) (unspec) > + ($continue k > + ($primcall 'return (unspec))))) > + (kvoid #f ($kargs () () > + ($continue kunspec ($void))))) > + ($continue kvoid ,exp))))) [...] > + (let ((drop-result > + (lambda (kseq) > + (let-gensyms (k* drop) > + (build-cps-term > + ($letk ((k* #f ($kargs ('drop) (drop) > + ($continue kseq ($values ()))))) > + ($continue k* ,exp))))))) Are ($void) and ($values ()) both equivalent to *unspecified*? > + (rewrite-cps-term (lookup-cont k conts) > + (($ $ktail) > + ,(rewrite-cps-term exp > + (($var sym) > + ($continue ktail ($primcall 'return (sym)))) > + (_ > + ,(let-gensyms (k* v) > + (build-cps-term > + ($letk ((k* #f ($kargs (v) (v) > + ($continue k > + ($primcall 'return (v)))))) > + ($continue k* ,exp))))))) > + (($ $ktrunc ($ $arity () () #f () #f) kseq) > + ,(drop-result kseq)) > + (($ $kargs () () _) > + ,(drop-result k)) > + (_ > + ($continue k ,exp))))))) Perhaps that happens in the Tree-IL->CPS pass, but is there/could there be an effect analysis when truncating multiple-value returns? Such that (f (values 1 2 3)) reduces to (f 1). Ludo’.