unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: master 68c09c6: Better CPS conversion of multi-binding `let`
       [not found] ` <20211130120405.6C5F4209FD@vcs0.savannah.gnu.org>
@ 2021-11-30 13:19   ` Stefan Monnier
  2021-11-30 13:30     ` Mattias Engdegård
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2021-11-30 13:19 UTC (permalink / raw)
  To: emacs-devel; +Cc: Mattias Engdegård

> -    ;; Process `let' in a helper function that transforms it into a
> -    ;; let* with temporaries.
> +    (`(,(or 'let 'let*) () . ,body)
> +      (cps--transform-1 `(progn ,@body) next-state))
> +
> +    (`(let (,binding) . ,body)
> +      (cps--transform-1 `(let* (,binding) ,@body) next-state))
> +
> +    ;; Transform multi-variable `let' into `let*':
> +    ;;    (let ((v1 e1) ... (vN eN)) BODY)
> +    ;; -> (let* ((t1 e1) ... (tN eN) (v1 t1) (vN tN)) BODY)

I think this optimization can be generalized to the multi-var case by
noticing that the transformation of (vN eN) into a pair (tN eN) ... (vN tN)
is not necessary because the order of the (v1 t1) ... (vN tN) doesn't matter
so we can move (vN tN) to the beginning, right next to (tN eN) and then
merge them back.


        Stefan




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: master 68c09c6: Better CPS conversion of multi-binding `let`
  2021-11-30 13:19   ` master 68c09c6: Better CPS conversion of multi-binding `let` Stefan Monnier
@ 2021-11-30 13:30     ` Mattias Engdegård
  2021-11-30 13:42       ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Mattias Engdegård @ 2021-11-30 13:30 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

30 nov. 2021 kl. 14.19 skrev Stefan Monnier <monnier@iro.umontreal.ca>:

> I think this optimization can be generalized to the multi-var case by
> noticing that the transformation of (vN eN) into a pair (tN eN) ... (vN tN)
> is not necessary because the order of the (v1 t1) ... (vN tN) doesn't matter
> so we can move (vN tN) to the beginning, right next to (tN eN) and then
> merge them back.

Not sure how that would work unless you imply some kind of dependency analysis. Maybe you have an example in mind?

(Sorry about the incorrect git summary line, by the way -- 'multi-binding' should have been 'single-binding'.)




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: master 68c09c6: Better CPS conversion of multi-binding `let`
  2021-11-30 13:30     ` Mattias Engdegård
@ 2021-11-30 13:42       ` Stefan Monnier
  2021-11-30 13:49         ` Mattias Engdegård
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2021-11-30 13:42 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: emacs-devel

>> I think this optimization can be generalized to the multi-var case by
>> noticing that the transformation of (vN eN) into a pair (tN eN) ... (vN tN)
>> is not necessary because the order of the (v1 t1) ... (vN tN) doesn't matter
>> so we can move (vN tN) to the beginning, right next to (tN eN) and then
>> merge them back.
>
> Not sure how that would work unless you imply some kind of dependency
> analysis. Maybe you have an example in mind?

No dependency analysis needed, just always turn

    (let ((x1 e1) ... (xN eN))
      BODY)

into

    (let* ((t1 e1) ... (tN-1 eN-1) (xN eN) (x1 t1) .. (xN-1 tN-1))
      BODY)


-- Stefan




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: master 68c09c6: Better CPS conversion of multi-binding `let`
  2021-11-30 13:42       ` Stefan Monnier
@ 2021-11-30 13:49         ` Mattias Engdegård
  2021-11-30 13:54           ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Mattias Engdegård @ 2021-11-30 13:49 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

30 nov. 2021 kl. 14.42 skrev Stefan Monnier <monnier@iro.umontreal.ca>:

>    (let ((x1 e1) ... (xN eN))
>      BODY)
> 
> into
> 
>    (let* ((t1 e1) ... (tN-1 eN-1) (xN eN) (x1 t1) .. (xN-1 tN-1))
>      BODY)

Sorry, I should have read your original comment more carefully; I thought you meant some way of eliminating more than one temporary. Yes, that's probably a good idea. I'll see what I can do.

(That function, cps--transform-1, suffers severely from our lack of TCO by the way.)




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: master 68c09c6: Better CPS conversion of multi-binding `let`
  2021-11-30 13:49         ` Mattias Engdegård
@ 2021-11-30 13:54           ` Stefan Monnier
  2021-11-30 14:11             ` Mattias Engdegård
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2021-11-30 13:54 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: emacs-devel

> (That function, cps--transform-1, suffers severely from our lack of TCO by the way.)

But we can wrap it within `named-let`, right?


        Stefan




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: master 68c09c6: Better CPS conversion of multi-binding `let`
  2021-11-30 13:54           ` Stefan Monnier
@ 2021-11-30 14:11             ` Mattias Engdegård
  0 siblings, 0 replies; 6+ messages in thread
From: Mattias Engdegård @ 2021-11-30 14:11 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

30 nov. 2021 kl. 14.54 skrev Stefan Monnier <monnier@iro.umontreal.ca>:

> But we can wrap it within `named-let`, right?

The thought did cross my mind, but I had to draw the line for my involvement in that code somewhere.




^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-11-30 14:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20211130120404.23495.29099@vcs0.savannah.gnu.org>
     [not found] ` <20211130120405.6C5F4209FD@vcs0.savannah.gnu.org>
2021-11-30 13:19   ` master 68c09c6: Better CPS conversion of multi-binding `let` Stefan Monnier
2021-11-30 13:30     ` Mattias Engdegård
2021-11-30 13:42       ` Stefan Monnier
2021-11-30 13:49         ` Mattias Engdegård
2021-11-30 13:54           ` Stefan Monnier
2021-11-30 14:11             ` Mattias Engdegård

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).