Thanks, even if that doesn't go into the docs, I'm putting that into a github gist.

On 21/06/2016 5:44 PM, Bas van Dijk wrote:
Hi Erik,

Do note that I went through the same trouble as you figuring out how
to apply builtins.readFile to a dynamically constructed path. Maybe we
can document this "trick" in the documentation of builtins.readFile so
other people don't have to go through the same trouble.

To understand these things I would recommend using nix-repl:

   $ nix-repl
   Welcome to Nix version 1.11.2. Type :? for help.

   nix-repl> name = "bar"

   nix-repl> ./foo + "${name}"
   /home/bas.van.dijk/foobar

Note that the previous is equivalent to the simpler:

   nix-repl> ./foo + name
   /home/bas.van.dijk/foobar

The reason that you get "foobar" is that we didn't include a "/". So
lets try to do that:

   nix-repl> ./foo/ + name
   error: syntax error, unexpected '+', at (string):1:8

Apparently the Nix path parser doesn't like a slash at the end of a
path literal. So lets try adding the slash dynamically:

   nix-repl> ./foo + "/" + name
   /home/bas.van.dijk/foobar

What happened here? Well, + is left associative so it is interpreted as:

   (./foo + "/") + name

Lets try evaluating that left expression alone:

   nix-repl> ./foo + "/"
   /home/bas.van.dijk/foo

Apparently Nix performs normalization on paths since the final slash
is not included. So lets put the parenthesis differently:

   nix-repl> ./foo + ("/" + name)
   /home/bas.van.dijk/foo/bar

That's better! Now we can shorten this using some antiquotation:

   nix-repl> ./foo + "/${name}"
   /home/bas.van.dijk/foo/bar

I hope this helped.

Cheers,

Bas

On 21 June 2016 at 09:19, 4levels <[email protected]> wrote:
Hi Bas,

Out of curiosity I've been experimenting with different approaches but only
yours works and I have no clue why..  Is there anything I can learn / read /
study to understand why?  Without having to study C++ (or python for that
matter as I can't even tell them apart ;-)
Is this basic lambda programming or very specific to Nix?

Works
builtins.readFile (./keys + "/${name}")

Doesn't work
builtins.readFile (./keys/ + "${name}") - unexpected +
builtins.readFile (./keys/ + name) - unexpected +
builtins.readFile (./keys + "/" + name") - no build errors, but doesn't
parse the / in the middle -> ./keysmancloud.amazon.iam.key_id -> not found

Kind regards and thanks again, my key deployment sections have become very
compact and maintainable now..

Erik

On Tue, Jun 21, 2016 at 1:56 AM 4levels <[email protected]> wrote:
Hi Bas,

Thank you so much! Exactly what I was looking for.
It's these basic things that I keep not getting my head around.. You have
no idea how many fruitless Google and GitHub searches I tried on this one
;-)

Finally resolved and another lesson learned, amazing!

Kind regards,

Erik


On Tue, Jun 21, 2016, 01:39 Bas van Dijk <[email protected]> wrote:
On 19 June 2016 at 15:58, 4levels <[email protected]> wrote:
builtins.readFile "./keys/${name}"
Hi Erik, try this:

   builtins.readFile (./keys + "/${name}")
_______________________________________________
nix-dev mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-dev

--
Founder of Matrix AI
https://matrix.ai/
+61420925975

_______________________________________________
nix-dev mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-dev

Reply via email to