{ pkgs }: { deps = [ pkgs.cowsay ]; }
It’s meaningless to 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.
{ 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