From: Alan Mackenzie <acm@muc.de>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: acm@muc.de, Eli Zaretskii <eliz@gnu.org>, 67455@debbugs.gnu.org
Subject: bug#67455: (Record source position, etc., in doc strings, and use this in *Help* and backtraces.)
Date: Wed, 27 Mar 2024 10:04:03 +0000 [thread overview]
Message-ID: <ZgPvE96-OisH-g8S@ACM> (raw)
In-Reply-To: <jwvttks3hpj.fsf-monnier+emacs@gnu.org>
Hello, Stefan.
On Tue, Mar 26, 2024 at 16:30:06 -0400, Stefan Monnier wrote:
> > We now have two distinct uses of SWPs: providing warning source locations
> > to the compiler (where we want to keep the position as long as possible)
> > and providing position information for the doc string (where we want to
> > strip the position from the symbol ASAP, to avoid trying to use the SWP
> > when we need a plain symbol). If both of these occur together, we want
> > to keep the SWP.
> I think I'm beginning to understand. So in the "load from source case",
> some of your symbols are SWPs and you want to turn them into bare
> symbols "on the fly" during macro-expansion rather than via a separate
> "strip" phase, ....
More precisely, to @dfn{posify} their containing forms by writing the
position information into their doc strings. We do this in the byte
compilation case, too. The difference is that in the "load from source"
case we want to strip the SWP, in byte compilation, we don't.
> .... so you want the macro expansion to know whether it's done
> for "load from source" or for some other purpose and you use
> `byte-compile-in-progress` as a proxy for that information.
> Is that it?
More or less. But byte-compile-in-progress isn't a proxy, it's the prime
criterion for deciding.
> If so, (and if the stripping happens within macros), then indeed passing
> it as a separate argument through all the recursive calls to
> `macroexp--expand-all` would be cumbersome. But I suggest you use
> another name for that(e.g. `macroexp-strip-position`) so the
> intention is made more clear.
I don't think that is a good name. The byte compiler has no business
setting "internal" variables for the posification processing. Instead it
should announce it's running and expect the posification to respect that.
I think byte-compile-in-progress is a good name for this.
> Better yet: to avoid the problem of dynamic scope extending "too far"
> (i.e. accidentally applying to nested loads/evals/compile/...), you
> could put the relevant info into `macroexpand-all-environment`.
> [ That var is also dynamically bound, but we're already careful to
> rebind it when needed so it doesn't apply to nested uses
> of macroexpansion. ]
That variable is only loaded in the 17th loaded Lisp file. The new
facility should be working at the earliest stages of loading Lisp, as it
does at the moment. Besides, macroexpand-all-environment is not
documented anywhere, what it is, what it's for, etc.
> >> > By "currently", I mean that a defining form such as defun or defvar has
> >> > commenced, but not yet terminated; its functions currently occupy stack
> >> > frames.
> >> So you mean we're inside `Fdefalias` or `Fdefvar_1`?
> > Yes, or inside a macro (defun, defmacro, ...) which expands to a
> > defalias.
> These are *very* different times: `Fdefalias` and `Fdefvar_1` are
> executed long after macroexpansion. And they're small C functions which
> run almost no external code at all, so they "occupy stack frames" only
> for a very short time.
I think we were talking about the handling of defining-symbol. It has a
valid binding outside of macros such as defun, and this binding is used
to posify the containing form.
> My crystal ball suggests that "currently" may be the wrong way to think
> about it: maybe instead of thinking of "when" (as in "during the
> definition of function FOO") what you're looking for might be "where"
> (as in "within the body of FOO").
> [ That's the same difference as the difference between dynamic and
> static scoping. ]
I'm having trouble understanding what you're saying, here.
> If my crystal ball is right, then the better place to put that info is
> probably `macroexpand-all-environment`.
See above.
> > Ideally, I would like to have bound defining-symbol inside defun.
> (defmacro my-defun (name args &rest body)
> `(cl-macrolet ((defining-symbol () '',name))
> (defun ,name ,args ,@body)))
> (my-defun my-foo (x) (list x (defining-symbol)))
> (symbol-function 'my-foo)
> ==> #f(lambda (x) [t] (list x 'my-foo))
> `cl-macrolet` uses `macroexpand-all-environment` for that.
cl-macs gets loaded far too late for such an approach to be useful.
> > Fload uses read-positioning-DEFINED-symbols, as contrasted with the
> > compiler, which uses read-positioning-symbols. r-p-d-s positions only
> > lambdas and NAMEs. r-p-s positions all symbols except nil.
> I think I'm beginning to understand (I guess I was struggling with your
> use of "position" as a verb for some reason which made me think that
> symbols were being moved rather than gaining position information).
Sorry about that.
> So, IIUC you use `read-positioning-DEFINED-symbols` instead of
> `read-positioning-symbols` because it's cheaper?
No, because it does the Right Thing.
> Do you have rough numbers comparing the cost of `read`,
> `read-positioning-symbols`, and `read-positioning-DEFINED-symbols`?
No, but they will be very close to eachother (and very cheap) since they
use the same engine, read0 (in lread.c). Each of them will be one or two
orders of magnitude faster than emulating them in Lisp.
> Also, IIUC you don't have a separate phase to strip the SWPs when
> loading from source, but instead you strip them as you "consume" their
> info during macroexpansion. If so, how/when/where do you strip the
> false positives that may occur inside quoted data or in code like:
> (defmacro foo (lambda bar) ...)
> (defmacro foo (defun bar) ...)
> (let* ((lambda foo)
> (defun bar))
> ...)
There's a pcase arm right at the end of macroexp--expand-all which strips
SWPs of their positions. Recursing through macroexp--all-forms will
eventually hit this pcase arm for these lambdas.
> > Ah, right. I hadn't considered this before. The changes are by their
> > very nature essentially complicated and difficult to understand.
> [ Hmm... maybe not the best salespitch. ]
;-) It's the truth, though.
> >> I think you can simply wait to add the entry to
> >> `macro-declarations-alist` until a later time, so the `defining-symbol`
> >> thingies will be ignored during the early bootstrap and once we have
> >> more infrastructure in place we can then register the handler on
> >> `macro-declarations-alist`.
> > This will not be simpler. It would involve re-evaluating defun, then
> > compensating for all the functions up to now whose NAMEs had been read
> > without positions.
> Not at all. Those will remain without position, but only in
> `src/bootstrap-emacs`.
This would be a Bad Thing. The current code is active right after
loading byte-run.
> In the real `src/emacs` they will get the position because they'll come
> from the `.el[cn]` file and by the time we get compile those files
> `macro-declarations-alist` will be fully populated.
The understanding we reached in November was that loading from source
files would be handled, too.
> > There is unavoidable conplexity, here.
> I'm definitely not convinced. I suspect you've been asking yourself
> "can it be made simpler" and you may indeed then convince yourself that
> the answer is no, because of assumptions you don't reconsider.
> Try instead to think about "what would it take to remove that complexity?".
> > I see things somewhat differently. We shouldn't increase the debugging
> > burden even on "expert users".
> Yet it's imposing more complexity (and hence more debugging burden) on
> those same expert users. 🙁
That's a fairly difficult philosophical question. Do we provide full
functionality at the cost of more (difficult) source code, or do we
restrict the functioality to keep the source simpler? I think with Emacs
we usually go with the first alternative.
> Stefan
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2024-03-27 10:04 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-26 14:30 bug#67455: Record source position, etc., in doc strings, and use this in *Help* and backtraces Alan Mackenzie
2023-12-04 17:36 ` Alan Mackenzie
2023-12-04 18:33 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-12-04 21:32 ` Alan Mackenzie
2023-12-04 21:56 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-12-04 22:30 ` Alan Mackenzie
2023-12-04 22:59 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-12-15 18:23 ` Alan Mackenzie
2023-12-15 23:12 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
[not found] ` <handler.67455.B.170100905232659.ack@debbugs.gnu.org>
2024-03-04 15:38 ` bug#67455: (Record source position, etc., in doc strings, and use this in *Help* and backtraces.) Alan Mackenzie
2024-03-09 21:36 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-10 16:02 ` Alan Mackenzie
2024-03-10 17:19 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-10 19:22 ` Alan Mackenzie
2024-03-10 21:03 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-24 11:04 ` Alan Mackenzie
2024-03-25 18:23 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-25 21:03 ` Alan Mackenzie
2024-03-25 22:10 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-26 9:48 ` Alan Mackenzie
2024-03-26 13:40 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-26 16:55 ` Alan Mackenzie
2024-03-26 19:40 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-26 20:21 ` Alan Mackenzie
2024-03-26 20:42 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-27 3:35 ` Alan Mackenzie
2024-03-27 12:23 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-27 22:00 ` Alan Mackenzie
2024-03-26 20:30 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-26 21:13 ` Drew Adams
2024-03-27 10:04 ` Alan Mackenzie [this message]
2024-03-27 12:22 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-27 21:43 ` Alan Mackenzie
2024-03-28 16:25 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-28 16:48 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-30 9:10 ` Alan Mackenzie
2024-03-30 9:53 ` Alan Mackenzie
2024-03-31 2:22 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-07 11:35 ` Alan Mackenzie
2024-04-08 2:19 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-08 2:56 ` Alan Mackenzie
2024-04-10 8:53 ` Alan Mackenzie
2024-03-30 11:03 ` Alan Mackenzie
2024-03-31 2:54 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-07 10:57 ` Alan Mackenzie
2024-04-08 3:16 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-08 8:32 ` Alan Mackenzie
2024-04-08 12:00 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-06-02 13:38 ` Alan Mackenzie
2024-06-03 4:52 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-06-05 15:01 ` Alan Mackenzie
2024-03-10 22:27 ` Alan Mackenzie
2024-03-11 0:50 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-13 10:54 ` Alan Mackenzie
2024-03-13 11:52 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-19 16:18 ` Alan Mackenzie
2024-03-19 20:47 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-19 21:40 ` Alan Mackenzie
2024-03-19 22:32 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-24 11:21 ` Alan Mackenzie
2024-06-01 17:40 ` Alan Mackenzie
2024-06-01 18:01 ` Eli Zaretskii
2024-06-01 18:15 ` Eli Zaretskii
2024-06-01 18:17 ` Alan Mackenzie
2024-06-01 23:14 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZgPvE96-OisH-g8S@ACM \
--to=acm@muc.de \
--cc=67455@debbugs.gnu.org \
--cc=eliz@gnu.org \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.