From: Juri Linkov <juri@linkov.net>
To: 44155@debbugs.gnu.org
Subject: bug#44155: Print integers as characters
Date: Thu, 22 Oct 2020 23:56:21 +0300 [thread overview]
Message-ID: <87mu0e0ykq.fsf_-_@mail.linkov.net> (raw)
In-Reply-To: <834kmmmn5j.fsf@gnu.org> (Eli Zaretskii's message of "Thu, 22 Oct 2020 15:59:52 +0300")
[-- Attachment #1: Type: text/plain, Size: 2932 bytes --]
Tags: patch
[Creating a separate feature request from bug#43866]
>> Let-binding a new variable 'print-integers-as-chars' to t:
>>
>> (let ((print-integers-as-chars t))
>> (pp '(("'A" . [?Á])
>> ("'E" . [?É])
>> ("'I" . [?Í])
>> ("'O" . [?Ó])
>> ("'U" . [?Ú])
>> ("'Y" . [?Ý]))
>> (current-buffer)))
>>
>> prints integers as characters:
>>
>> (("'A" . [?Á])
>> ("'E" . [?É])
>> ("'I" . [?Í])
>> ("'O" . [?Ó])
>> ("'U" . [?Ú])
>> ("'Y" . [?Ý]))
>>
>> with this patch:
>
> The idea is fine, but I have a few comments about implementation:
>
>> case_Lisp_Int:
>> {
>> - int len = sprintf (buf, "%"pI"d", XFIXNUM (obj));
>> - strout (buf, len, len, printcharfun);
>> + if (!NILP (Vprint_integers_as_chars) && CHARACTERP (obj))
> ^^^^^^^^^^^^^^^^^^^^^^^^
> If this is supposed to be a boolean variable, please use DEFVAR_BOOL,
> with all the consequences.
Fixed in the next patch.
>> + int len = sprintf (buf, "%s", SDATA (call1 (intern ("prin1-char"), obj)));
>
> Do we really need to call Lisp? I thought we were quite capable of
> printing characters from C, aren't we?
Thanks for the hint. Now the patch uses only C functions.
(My initial idea was to use eval-expression-print-format as a base that has
(let ((char-string
(and (characterp value)
(<= value eval-expression-print-maximum-character)
(char-displayable-p value)
(prin1-char value))))
but it seems only the condition 'characterp' is needed in C implementation.)
>> @@ -2247,6 +2255,10 @@ syms_of_print (void)
>> that represents the number without losing information. */);
>> Vfloat_output_format = Qnil;
>>
>> + DEFVAR_LISP ("print-integers-as-chars", Vprint_integers_as_chars,
>> + doc: /* Print integers as characters. */);
>> + Vprint_integers_as_chars = Qnil;
>
> I wonder whether it wouldn't be cleaner to add another optional
> argument to prin1, and let it bind some internal variable so that
> print_object does this, instead of exposing this knob to Lisp.
> Because print_object is used all over the place, and who knows what
> will this do to other callers?
The variable 'print-integers-as-chars' is modeled after many similar
variables that affect the prin1 output:
- print-escape-control-characters
- print-escape-newlines
- print-escape-nonascii
- print-escape-multibyte
- print-length
- print-level
- print-quoted
- print-circle
- float-output-format
But now this leads me to think that maybe the new variable should be
like 'float-output-format', so it could be named 'integer-output-format'
and support options for different integer formats:
- 'character': print integers as characters;
- 'decimal': the default format;
- 'binary': print integers as e.g. #b010101;
- 'octal': print integers as e.g. #o777;
- 'hex': print integers as e.g. #x00ff;
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: print-integers-as-characters.patch --]
[-- Type: text/x-diff, Size: 1219 bytes --]
diff --git a/src/print.c b/src/print.c
index dca095f281..909c55efed 100644
--- a/src/print.c
+++ b/src/print.c
@@ -1908,8 +1908,16 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag)
{
case_Lisp_Int:
{
- int len = sprintf (buf, "%"pI"d", XFIXNUM (obj));
- strout (buf, len, len, printcharfun);
+ if (print_integers_as_characters && CHARACTERP (obj))
+ {
+ printchar ('?', printcharfun);
+ print_string (CALLN (Fstring, obj), printcharfun);
+ }
+ else
+ {
+ int len = sprintf (buf, "%"pI"d", XFIXNUM (obj));
+ strout (buf, len, len, printcharfun);
+ }
}
break;
@@ -2247,6 +2255,10 @@ syms_of_print (void)
that represents the number without losing information. */);
Vfloat_output_format = Qnil;
+ DEFVAR_BOOL ("print-integers-as-characters", print_integers_as_characters,
+ doc: /* Print integers as characters. */);
+ print_integers_as_characters = 0;
+
DEFVAR_LISP ("print-length", Vprint_length,
doc: /* Maximum length of list to print before abbreviating.
A value of nil means no limit. See also `eval-expression-print-length'. */);
next prev parent reply other threads:[~2020-10-22 20:56 UTC|newest]
Thread overview: 109+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-08 12:05 bug#43866: 26.3; italian postfix additions Francesco Potortì
2020-10-08 12:26 ` Eli Zaretskii
2020-10-08 12:34 ` Francesco Potortì
2020-10-08 12:39 ` Robert Pluim
2020-10-08 12:57 ` Eli Zaretskii
2020-10-08 13:54 ` Robert Pluim
2020-10-08 14:24 ` Robert Pluim
2020-10-08 14:32 ` Eli Zaretskii
2020-10-08 13:26 ` Francesco Potortì
2020-10-08 14:00 ` Robert Pluim
2020-10-13 20:07 ` Juri Linkov
2020-10-14 2:31 ` Eli Zaretskii
2020-10-14 8:07 ` Juri Linkov
2020-10-14 15:07 ` Eli Zaretskii
2020-10-14 19:40 ` Juri Linkov
2020-10-15 2:34 ` Eli Zaretskii
2020-10-19 20:45 ` Juri Linkov
2020-10-19 23:12 ` Stefan Kangas
2020-10-20 18:42 ` Juri Linkov
2020-10-20 14:12 ` Eli Zaretskii
2020-10-20 14:47 ` Robert Pluim
2020-10-20 15:50 ` Eli Zaretskii
2020-10-20 18:44 ` Juri Linkov
2020-10-20 19:05 ` Juri Linkov
2020-10-21 8:11 ` Robert Pluim
2020-10-21 14:29 ` Eli Zaretskii
2020-10-21 14:40 ` Robert Pluim
2020-10-21 15:23 ` Eli Zaretskii
2020-10-21 17:30 ` Juri Linkov
2020-10-20 19:56 ` Juri Linkov
2020-10-21 14:02 ` Eli Zaretskii
2020-10-21 17:23 ` Juri Linkov
2020-10-21 18:16 ` Eli Zaretskii
2020-10-21 18:27 ` Juri Linkov
2020-10-21 18:35 ` Eli Zaretskii
2020-10-21 19:39 ` Juri Linkov
2020-10-22 12:59 ` Eli Zaretskii
2020-10-22 20:56 ` Juri Linkov [this message]
2020-10-22 22:39 ` bug#44155: Print integers as characters Andreas Schwab
2020-10-23 8:16 ` Juri Linkov
2020-10-23 8:32 ` Juri Linkov
2020-10-24 19:53 ` Juri Linkov
2020-10-25 17:22 ` Eli Zaretskii
2020-10-25 19:09 ` Juri Linkov
2020-10-25 19:53 ` Eli Zaretskii
2020-10-27 20:08 ` Juri Linkov
2020-10-28 15:51 ` Eli Zaretskii
2020-10-28 19:41 ` Juri Linkov
2020-10-29 14:20 ` Eli Zaretskii
2020-10-29 21:00 ` Juri Linkov
2020-10-30 7:35 ` Eli Zaretskii
2020-10-31 20:11 ` Juri Linkov
2020-10-31 23:27 ` Glenn Morris
2020-11-01 7:58 ` Juri Linkov
2020-11-01 15:13 ` Eli Zaretskii
2020-11-01 18:39 ` Juri Linkov
2020-11-01 18:51 ` Eli Zaretskii
2020-11-01 19:13 ` Juri Linkov
2020-11-01 19:41 ` Eli Zaretskii
2020-11-01 20:16 ` Juri Linkov
2020-11-01 12:03 ` Mattias Engdegård
2020-11-01 18:35 ` Juri Linkov
2020-11-01 20:52 ` Mattias Engdegård
2020-11-02 21:36 ` Juri Linkov
2020-11-02 23:03 ` Mattias Engdegård
2020-11-03 8:30 ` Juri Linkov
2020-11-03 15:24 ` Eli Zaretskii
2020-11-03 18:47 ` Mattias Engdegård
2020-11-03 19:36 ` Eli Zaretskii
2020-11-04 11:03 ` Mattias Engdegård
2020-11-04 15:38 ` Eli Zaretskii
2020-11-04 16:46 ` Mattias Engdegård
2020-11-04 16:58 ` Mattias Engdegård
2020-11-06 13:02 ` Mattias Engdegård
2022-04-30 12:19 ` bug#43866: 26.3; italian postfix additions Lars Ingebrigtsen
2022-04-30 12:29 ` Eli Zaretskii
2022-04-30 14:49 ` Lars Ingebrigtsen
2022-04-30 15:26 ` Eli Zaretskii
2022-04-30 18:49 ` Lars Ingebrigtsen
2022-05-29 13:35 ` Lars Ingebrigtsen
2020-10-15 3:52 ` Richard Stallman
2020-10-14 4:38 ` Richard Stallman
2020-10-14 8:11 ` Juri Linkov
2020-10-14 10:43 ` Robert Pluim
2020-10-15 3:54 ` Richard Stallman
2020-10-14 14:56 ` Eli Zaretskii
2020-10-08 15:23 ` Mattias Engdegård
2020-10-08 15:35 ` Robert Pluim
2020-10-08 16:22 ` Francesco Potortì
2020-10-08 15:42 ` Eli Zaretskii
2020-10-08 16:10 ` Francesco Potortì
2020-10-08 17:18 ` Robert Pluim
2020-10-08 17:28 ` Francesco Potortì
2020-10-08 17:59 ` Mattias Engdegård
2020-10-08 19:55 ` Francesco Potortì
2020-10-09 4:42 ` Lars Ingebrigtsen
2020-10-09 11:26 ` Mattias Engdegård
2020-10-09 11:53 ` Thien-Thi Nguyen
2020-10-09 12:45 ` Robert Pluim
2020-10-09 14:31 ` Eli Zaretskii
2020-10-09 14:48 ` Robert Pluim
2020-10-09 15:04 ` Eli Zaretskii
2020-10-10 20:54 ` Lars Ingebrigtsen
2020-10-12 9:26 ` Robert Pluim
2020-10-09 15:05 ` Mattias Engdegård
2020-10-09 15:08 ` Robert Pluim
2020-10-09 15:28 ` Mattias Engdegård
2020-10-09 15:10 ` Eli Zaretskii
2020-10-09 15:21 ` Robert Pluim
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=87mu0e0ykq.fsf_-_@mail.linkov.net \
--to=juri@linkov.net \
--cc=44155@debbugs.gnu.org \
/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.