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:
parent
407175a1d0
commit
6c343d0d0f
@ -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)))
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user