l...@gnu.org (Ludovic Courtès) writes: > 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*?
No. ($void) passes a single value (*unspecified*), to the continuation. ($values ()) passes zero values to the continuation, like (values). >> + (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). I guess this is a question for Andy, but some experimentation suggests that this transformation is already done by an earlier optimization pass in tree-il. Regards, Mark