gexp: Gracefully handle printing of gexps with spliced references.
* guix/gexp.scm (write-gexp): Wrap 'write' call in
  'false-if-exception'.
* tests/gexp.scm ("printer", "printer vs. ungexp-splicing"): New tests.
			
			
This commit is contained in:
		
							parent
							
								
									8aaaae38a3
								
							
						
					
					
						commit
						2cf0ea0dbb
					
				
					 2 changed files with 24 additions and 1 deletions
				
			
		|  | @ -60,7 +60,12 @@ | |||
| (define (write-gexp gexp port) | ||||
|   "Write GEXP on PORT." | ||||
|   (display "#<gexp " port) | ||||
|   (write (apply (gexp-proc gexp) (gexp-references gexp)) port) | ||||
| 
 | ||||
|   ;; Try to write the underlying sexp.  Now, this trick doesn't work when | ||||
|   ;; doing things like (ungexp-splicing (gexp ())) because GEXP's procedure | ||||
|   ;; tries to use 'append' on that, which fails with wrong-type-arg. | ||||
|   (false-if-exception | ||||
|    (write (apply (gexp-proc gexp) (gexp-references gexp)) port)) | ||||
|   (format port " ~a>" | ||||
|           (number->string (object-address gexp) 16))) | ||||
| 
 | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ | |||
|   #:use-module (srfi srfi-64) | ||||
|   #:use-module (rnrs io ports) | ||||
|   #:use-module (ice-9 match) | ||||
|   #:use-module (ice-9 regex) | ||||
|   #:use-module (ice-9 popen)) | ||||
| 
 | ||||
| ;; Test the (guix gexp) module. | ||||
|  | @ -247,6 +248,23 @@ | |||
|       (return (and (zero? (close-pipe pipe)) | ||||
|                    (= (expt n 2) (string->number str))))))) | ||||
| 
 | ||||
| (test-assert "printer" | ||||
|   (string-match "^#<gexp \\(string-append .*#<package coreutils.*\ | ||||
|  \"/bin/uname\"\\) [[:xdigit:]]+>$" | ||||
|                 (with-output-to-string | ||||
|                   (lambda () | ||||
|                     (write | ||||
|                      (gexp (string-append (ungexp coreutils) | ||||
|                                           "/bin/uname"))))))) | ||||
| 
 | ||||
| (test-assert "printer vs. ungexp-splicing" | ||||
|   (string-match "^#<gexp .* [[:xdigit:]]+>$" | ||||
|                 (with-output-to-string | ||||
|                   (lambda () | ||||
|                     ;; #~(begin #$@#~()) | ||||
|                     (write | ||||
|                      (gexp (begin (ungexp-splicing (gexp ()))))))))) | ||||
| 
 | ||||
| (test-equal "sugar" | ||||
|   '(gexp (foo (ungexp bar) (ungexp baz "out") | ||||
|               (ungexp (chbouib 42)) | ||||
|  |  | |||
		Reference in a new issue