diff options
author | Ludovic Courtès <ludo@gnu.org> | 2021-02-28 21:29:53 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2021-03-30 22:48:44 +0200 |
commit | da86e90efe796ee68ee0a5ccaf46f45cadb52336 (patch) | |
tree | f41ead1149e88e133c3c2a78b643a85dd718efcd | |
parent | 4f5f1d98efe4343cd301d684094a00b82e069f1d (diff) |
gexp: Add 'sexp->gexp'.
* guix/gexp.scm (sexp->gexp): New procedure.
* tests/gexp.scm ("sexp->gexp"): New test.
-rw-r--r-- | guix/gexp.scm | 11 | ||||
-rw-r--r-- | tests/gexp.scm | 7 |
2 files changed, 18 insertions, 0 deletions
diff --git a/guix/gexp.scm b/guix/gexp.scm index a4e6590b52..526a21fdd7 100644 --- a/guix/gexp.scm +++ b/guix/gexp.scm @@ -39,6 +39,7 @@ #:use-module (ice-9 match) #:export (gexp gexp? + sexp->gexp with-imported-modules with-extensions let-system @@ -1844,6 +1845,16 @@ of name/gexp-input tuples, and OUTPUTS, a list of strings." (ungexp body)))) +(define (sexp->gexp sexp) + "Turn SEXP into a gexp without any references. + +Using this is a way for the caller to tell that SEXP doesn't need to be +scanned for file-like objects, thereby reducing processing costs. This is +particularly useful if SEXP is a long list or a deep tree." + (make-gexp '() '() '() + (lambda () sexp) + (source-properties sexp))) + (define* (gexp->script name exp #:key (guile (default-guile)) (module-path %load-path) diff --git a/tests/gexp.scm b/tests/gexp.scm index 834e78b9a0..64c3107ef7 100644 --- a/tests/gexp.scm +++ b/tests/gexp.scm @@ -96,6 +96,13 @@ (null? (gexp-inputs exp)) (gexp->sexp* exp)))) +(test-equal "sexp->gexp" + '(a b (c d) e) + (let ((exp (sexp->gexp '(a b (c d) e)))) + (and (gexp? exp) + (null? (gexp-inputs exp)) + (gexp->sexp* exp)))) + (test-equal "unquote" '(display `(foo ,(+ 2 3))) (let ((exp (gexp (display `(foo ,(+ 2 3)))))) |