read-print: Do not use extended notation when printing '1+', '1-', etc.

* guix/read-print.scm (%special-non-extended-symbols): New variable.
(symbol->display-string): New procedure.
(pretty-print-with-comments): Use it in lieu of 'string->symbol'.
* tests/read-print.scm: Add test.
This commit is contained in:
Ludovic Courtès 2023-01-09 17:04:55 +01:00
parent 407175a1d0
commit 6c343d0d0f
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 25 additions and 4 deletions

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2021-2022 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2021-2023 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@ -488,6 +488,19 @@ each line except the first one (they're assumed to be already there)."
(8 "#o"))
(number->string integer base)))
(define %special-non-extended-symbols
;; Special symbols that can be written without the #{...}# notation for
;; extended symbols: 1+, 1-, 123/, etc.
(make-regexp "^[0-9]+[[:graph:]]+$" regexp/icase))
(define (symbol->display-string symbol context)
"Return the most appropriate representation of SYMBOL, resorting to extended
symbol notation only when strictly necessary."
(let ((str (symbol->string symbol)))
(if (regexp-exec %special-non-extended-symbols str)
str ;no need for the #{...}# notation
(object->string symbol))))
(define* (pretty-print-with-comments port obj
#:key
(format-comment
@ -561,7 +574,8 @@ FORMAT-VERTICAL-SPACE; a useful value of 'canonicalize-vertical-space'."
((? string? str)
(>= (+ (string-width str) 2 indent) max-width))
((? symbol? symbol)
(>= (+ (string-width (symbol->string symbol)) indent)
(>= (+ (string-width (symbol->display-string symbol context))
indent)
max-width))
((? boolean?)
(>= (+ 2 indent) max-width))
@ -647,7 +661,7 @@ FORMAT-VERTICAL-SPACE; a useful value of 'canonicalize-vertical-space'."
;; and following arguments are less indented.
(let* ((lead (special-form-lead head context))
(context (cons head context))
(head (symbol->string head))
(head (symbol->display-string head (cdr context)))
(total (length arguments)))
(unless delimited? (display " " port))
(display "(" port)
@ -727,6 +741,8 @@ FORMAT-VERTICAL-SPACE; a useful value of 'canonicalize-vertical-space'."
(printed-string obj context))
((integer? obj)
(integer->string obj context))
((symbol? obj)
(symbol->display-string obj context))
(else
(object->string obj))))
(len (string-width str)))

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2021-2022 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2021-2023 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@ -142,6 +142,11 @@ expressions."
(+ x y))"
#:max-width 11)
(test-pretty-print "\
(begin
1+ 1- 123/ 456*
(1+ 41))")
(test-pretty-print "\
(lambda (x y)
;; This is a procedure.