guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 6/9] Add arity-adapting module


From: Ludovic Courtès
Subject: Re: [PATCH 6/9] Add arity-adapting module
Date: Thu, 29 Aug 2013 23:08:11 +0200
User-agent: Gnus/5.130007 (Ma Gnus v0.7) Emacs/24.3 (gnu/linux)

Andy Wingo <address@hidden> 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

[Prev in Thread] Current Thread [Next in Thread]