read-print: 'read-with-comments' reads comments within gexps.

Fixes <https://issues.guix.gnu.org/62059>.
Reported by Maxim Cournoyer <maxim.cournoyer@gmail.com>.

* guix/read-print.scm (read-with-comments): Special-case #~, #$, and #+.
* tests/read-print.scm: Add two tests.
This commit is contained in:
Ludovic Courtès 2023-03-16 22:18:52 +01:00
parent 8f219e658d
commit 83128f00e9
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 36 additions and 0 deletions

View File

@ -219,6 +219,27 @@ BLANK-LINE? is true, assume PORT is at the beginning of a new line."
(list 'quote (loop #f return)))
((eq? chr #\`)
(list 'quasiquote (loop #f return)))
((eq? chr #\#)
(match (read-char port)
(#\~ (list 'gexp (loop #f return)))
(#\$ (list (match (peek-char port)
(#\@
(read-char port) ;consume
'ungexp-splicing)
(_
'ungexp))
(loop #f return)))
(#\+ (list (match (peek-char port)
(#\@
(read-char port) ;consume
'ungexp-native-splicing)
(_
'ungexp-native))
(loop #f return)))
(chr
(unread-char chr port)
(unread-char #\# port)
(read port))))
((eq? chr #\,)
(list (match (peek-char port)
(#\@

View File

@ -231,6 +231,21 @@ mnopqrstuvwxyz.\")"
;; Regular indentation for 'replace' here.
(replace \"gmp\" gmp))")
(test-pretty-print "\
#~(modify-phases phases
(add-after 'whatever 'something-else
(lambda _
;; This comment appears inside a gexp.
42)))")
(test-pretty-print "\
#~(list #$@(list coreutils ;yup
grep) ;margin comment
#+sed
;; Line comment.
#$grep)")
(test-pretty-print "\
(package
;; Here 'sha256', 'base32', and 'arguments' must be