unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* buffer-string considered as a Bad Thing.
@ 2024-06-04 19:05 Alan Mackenzie
  2024-06-04 20:22 ` Andreas Schwab
  0 siblings, 1 reply; 4+ messages in thread
From: Alan Mackenzie @ 2024-06-04 19:05 UTC (permalink / raw)
  To: emacs-devel

Hello, Emacs.

In master (or any other non-prehistoric version of Emacs), buffer-string
gets misused.  In particular, function attempting to "print to a string"
first print to a temporary buffer, then call buffer-string to get that
printed object into the string.

As an example, in pp, the function pp-to-string does this.  To see the
effect, try

    M-: (pp "foo \"bar\" baz")

..  This gets printed correctly to the temporary buffer  *temp* as:

    "foo \"bar\" baz" ;; (a 13 character string)

, but buffer-string wrongly converts those literal characters to

    "foo \\\"bar\\\" baz" ;; (a 15 character string)

..

Printing to a temporary buffer then converting that to a string (without
reading it) appears to be a workaround for the Emacs core failing to
allow a string as a possibility for PRINTCHARFUN in functions like
prin1 and princ.

An ideal solution seems to be somehow allowing a string to be
PRINTCHARFUN for these functions.  However print1 and friends don't
return values; instead they append to buffers or output to output
streams like stdout.  Allowing a string output would be somewhat
awkward.

If this awkwardness rules out output to strings, we need better
machinery than buffer-string to get a correct string from a buffer.  We
need to expose some more functionality from the reader to Lisp.  With
that we could write a function for filter-buffer-substring-function and
thus correctly convert the temp buffer back to a string.  Or something
like that.

Before I raise a bug report, what do people think about this?

-- 
Alan Mackenzie (Nuremberg, Germany).



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

* Re: buffer-string considered as a Bad Thing.
  2024-06-04 19:05 buffer-string considered as a Bad Thing Alan Mackenzie
@ 2024-06-04 20:22 ` Andreas Schwab
  2024-06-04 20:51   ` Alan Mackenzie
  0 siblings, 1 reply; 4+ messages in thread
From: Andreas Schwab @ 2024-06-04 20:22 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

On Jun 04 2024, Alan Mackenzie wrote:

> As an example, in pp, the function pp-to-string does this.  To see the
> effect, try
>
>     M-: (pp "foo \"bar\" baz")
>
> ..  This gets printed correctly to the temporary buffer  *temp* as:
>
>     "foo \"bar\" baz" ;; (a 13 character string)
>
> , but buffer-string wrongly converts those literal characters to
>
>     "foo \\\"bar\\\" baz" ;; (a 15 character string)

That's not what I get.

ELISP> (pp-to-string "foo \"bar\" baz")
"\"foo \\\"bar\\\" baz\""

This string correctly represents the contents of the buffer.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."



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

* Re: buffer-string considered as a Bad Thing.
  2024-06-04 20:22 ` Andreas Schwab
@ 2024-06-04 20:51   ` Alan Mackenzie
  2024-06-04 21:24     ` Andreas Schwab
  0 siblings, 1 reply; 4+ messages in thread
From: Alan Mackenzie @ 2024-06-04 20:51 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: emacs-devel

Hello, Andreas.

On Tue, Jun 04, 2024 at 22:22:52 +0200, Andreas Schwab wrote:
> On Jun 04 2024, Alan Mackenzie wrote:

> > As an example, in pp, the function pp-to-string does this.  To see the
> > effect, try

> >     M-: (pp "foo \"bar\" baz")

> > ..  This gets printed correctly to the temporary buffer  *temp* as:

> >     "foo \"bar\" baz" ;; (a 13 character string)

> > , but buffer-string wrongly converts those literal characters to

> >     "foo \\\"bar\\\" baz" ;; (a 15 character string)

> That's not what I get.

> ELISP> (pp-to-string "foo \"bar\" baz")
> "\"foo \\\"bar\\\" baz\""

> This string correctly represents the contents of the buffer.

That may well be, but the contents of that buffer don't reflect the
contents of the original string which was printed by pp.  This string
contained no backslash characters.  The output string contains two of
them.

pp-to-string prints (in the sense of read-eval-print loop) its argument
to the buffer.  To get that argument back from the buffer, it needs to be
_read_, not merely copied.

Did you consider my two suggestions for fixing this?  If so, what did you
think of them?

> -- 
> Andreas Schwab, schwab@linux-m68k.org
> GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
> "And now for something completely different."

-- 
Alan Mackenzie (Nuremberg, Germany).



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

* Re: buffer-string considered as a Bad Thing.
  2024-06-04 20:51   ` Alan Mackenzie
@ 2024-06-04 21:24     ` Andreas Schwab
  0 siblings, 0 replies; 4+ messages in thread
From: Andreas Schwab @ 2024-06-04 21:24 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

On Jun 04 2024, Alan Mackenzie wrote:

> That may well be, but the contents of that buffer don't reflect the
> contents of the original string which was printed by pp.

pp produces a *quoted* printed representation of the argument.

ELISP> (read (pp-to-string "foo \"bar\" baz"))
"foo \"bar\" baz"

If you want to print the literal contents of a string use princ.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."



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

end of thread, other threads:[~2024-06-04 21:24 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-04 19:05 buffer-string considered as a Bad Thing Alan Mackenzie
2024-06-04 20:22 ` Andreas Schwab
2024-06-04 20:51   ` Alan Mackenzie
2024-06-04 21:24     ` Andreas Schwab

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).