I had tried to compile some software that linked against macOS SDKs, and did not realise that Nix essentially maintains it’s own version, and it was quite tricky to adapt to it or get back to using Xcode’s toolchain.
{ pkgs }: { deps = [ pkgs.cowsay ]; }
It’s meaningless to my brain.
{ pkgs }: { deps = [ pkgs.cowsay ]; }
({ pkgs }): { deps = [ pkgs.cowsay ]; }
({ pkgs }) => { deps = [ pkgs.cowsay ]; }
({ pkgs }) => ({ deps = [ pkgs.cowsay ]; })> ({ pkgs }) => ({ deps = [ pkgs.cowsay ]; })
But the syntax for declaring objects in javascript differs. It would be:
({ pkgs }) => ({ deps: pkgs.cowsay })
The fact that '{ x = 1; }' is declaring an object, identical to '{x: 1}' in javascript, is important.It's also worth pointing out that, while '{ pkgs }:' is idiomatic nix, idiomatically in javascript you'd probably just take multiple arguments (so '(pkgs) =>', not '({ pkgs }) =>' in js). The reason nix uses an object there is because a nix function only takes one argument, so there's a fairly common convention to make that argument an attr in order to simulate multiple arguments. That convention doesn't exist in quite the same way in js.
I also translate all nix to JavaScript in my brain
({ pkgs }) => { deps: [ pkgs.cowsay ] }
or python:
lambda pkgs: { deps: [pkgs.cowsay] }
I guess really the question is why create a new language rather than using an existing one? The language needed to be functional, lazy, and good at managing packages, and not much else. I guess they felt that no existing language fits the bill (Haskell does I guess but it's got a lot of baggage). I can't claim to know much about its history.
I think following simple examples is straightforward. I think anyone who can install python and ruby with brew would be able to look at a replit.nix which uses python, and figure out how to change it to also install ruby.
Even for just simple cases, I think Nix is compelling and worth looking into.
"Nix is weird" becomes more of an issue for a long tail of edge cases, where a developer is likely to bump into one of these, and it won't be clear where in the documentation to go. -- With Nix being so weird, it both requires a familiarity with what you're doing in a standard-linux way, as well as familiarity with how things need to be done with Nix.
e.g. the nginxModified in the OP makes use of overrideAttrs. (You'd need to know both that nginx can be configured like that, as well as how to configure with nix).