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’.


Reply via email to