From da86e90efe796ee68ee0a5ccaf46f45cadb52336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Sun, 28 Feb 2021 21:29:53 +0100 Subject: [PATCH] gexp: Add 'sexp->gexp'. * guix/gexp.scm (sexp->gexp): New procedure. * tests/gexp.scm ("sexp->gexp"): New test. --- guix/gexp.scm | 11 +++++++++++ tests/gexp.scm | 7 +++++++ 2 files changed, 18 insertions(+) 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))))))