Subject: bug#67455: (Record source position, etc., in doc strings, and use this in *Help* and backtraces.)

From: Stefan Monnier <[email-masked]>
Date: Sat, 09 Mar 2024 16:36:57 -0500

> I've just pushed a large commit to feature/positioned-lambdas, a work
> in progress commit for bug#67455, putting source position information at
> the start of doc strings.  master was merged into it just before the
> commit.

I barely started to look at the code, but regarding the following hunk:

    diff --git a/lisp/emacs-lisp/backquote.el b/lisp/emacs-lisp/backquote.el
    index 6917128d70a..0d4681bc979 100644
    --- a/lisp/emacs-lisp/backquote.el
    +++ b/lisp/emacs-lisp/backquote.el
    @@ -172,6 +172,30 @@ backquote-process
           (backquote-delay-process s (1- level))))
        ((eq (car s) backquote-backquote-symbol)
           (backquote-delay-process s (1+ level)))
    +   ;; Process a (lambda ...) form specially, since otherwise the
    +   ;; lambda symbol would get separated from its introductory (,
    +   ;; preventing this processing from being done elsewhere in macro
    +   ;; expansion.
    +   ((and (eq (car s) 'lambda)
    +         (symbol-with-pos-p (car s))
    +         (listp (car-safe (cdr s))))
    +    (let ((kdr (backquote-process (cdr s) level))
    +          (lambda-pos (symbol-with-pos-pos (car s)))
    +          )
    +      (if (null byte-compile-in-progress)
    +          (setcar s 'lambda))           ; Strip the position.
    +      (cond
    +       ((= (car kdr) 0)
    +        (cons (car kdr)
    +              (list 'quote
    +                    (byte-run-posify-lambda-form
    +                     (cons (car s) (car (cdr (cdr kdr)))) ; Two cdr's to strip 'quote.
    +                     lambda-pos))))
    +       (t
    +        (cons 1
    +              (list 'byte-run-posify-lambda-form
    +                    (list 'cons (list 'quote (car s)) (cdr kdr))
    +                    lambda-pos))))))
        (t
         (let ((rest s)
              item firstlist list lists expression)

- Testing `byte-compile-in-progress` can't be right.  Do you to test
  whether the result of this backquote will be byte-compiled or do you
  really mean to test whether this backquote happens to be executed
  during compilation (which could be because the compiler ends up
  loading code while executing `eval-when-compile` or `require`)?

- My gut tells me that changing backquote can't be right.
  (lambda (f) ..) *can* appear within a backquote without it being an
  actual lambda expression.
  What alternatives have you considered?

        Stefan