Subject: Re: bug#52063: 28.0.60; Confusing presentation of lambda

From: Stefan Monnier <[email-masked]>
Date: Thu, 25 Nov 2021 14:07:45 -0500

> Depends on the length of the lexical list, though:
>
> (pp-emacs-lisp-code
>  (let ((bar 1))
>    (lambda (f) (setq foo bar) (setq foo bar))))
> =>
> (closure ((bar . 1) t) (f)
>   (setq foo bar)
>   (setq foo bar))
>
> can be unwieldy if the list is long.

[ Taking a step back and ignoring practical concerns like whether it's
  easy to implement efficiently.  ]

We could have something like:

    (let ((foo 1)
          (bar 2)
          (baz 5))
      (lambda (x) (+ x bar)))

return an object like

    (closure (x) ((bar . 2))
      (+ x bar))

instead of the current

    (closure ((baz . 5) (bar . 2) (foo . 1) t) (x)
      (+ x bar))

IOW, the final `t` can be dispensed with, we could swap the arglist and
the captured environment, and we could filter the environment to only
include variables which are actually used inside the function.

        Stefan