Hi Ludo, Ludovic Courtès writes: > Actually, what bug are we talking about? It seems to work for me with > this example: > > --8<---------------cut here---------------start------------->8--- > scheme@(guile-user)> (define packages `(("coreutils" ,coreutils) ("make" ,gnu-make))) > scheme@(guile-user)> ,build (scheme-file "foo" #~(begin '#$packages)) > building /gnu/store/lq9gvbilv0y2nph00zxk6bn3lvcgdxqq-foo.drv... > $7 = "/gnu/store/9ryh6v80jvjv3kwx0q782h26h9gbaclj-foo" > scheme@(guile-user)> (call-with-input-file $7 get-string-all) > $8 = "(begin (quote ((\"coreutils\" \"/gnu/store/mppp9hwxizx9g9pikwcvvshb2ffxyq7p-coreutils-9.1\") (\"make\" \"/gnu/store/9fadhs5qmwl5x7f669a0v39b3ryrmmf1-make-4.3\"))))" > --8<---------------cut here---------------end--------------->8--- > > One of the design decisions for gexps was to ensure that substituting a > file-like object by its file name would be O(1) in most cases. > > Substitution in lists as in the example above is supported, but > primarily for backward compatibility. It should be avoided when > possible because it’s inefficient: ‘gexp->sexp’ needs to traverse the > whole list/tree in search of potential candidates. Notice that OP's example uses `(("thing" . ,package)), ie. lists of pairs and not lists of lists, as in your case! Best, -- Josselin Poiret