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: Mark H Weaver
Subject: Re: [PATCH 6/9] Add arity-adapting module
Date: Thu, 29 Aug 2013 18:26:22 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

address@hidden (Ludovic Courtès) writes:

> 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*?

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



reply via email to

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