%title Nix the Language :nix: %date 190921-1402 Trying to understand the Nix Language Nix is a functional source grabber and builder. It's not really a package manager, only incidentally so. (Nixpkgs notwithstanding?) `nix repl` is your friend! = AttrSets = The building block datastructure in Nix. Basically just a DictionarySet ```nix { = ...; } ``` = Functions = Nix functions work kinda like Haskell, but no types ```nix > double = x: x*2 > double 2 > 4 ``` Since nix is fucking Haskell, arguments get passed through currying ```nix > add = x: y: x + y > add 2 3 > 5 ``` It's good practice to pass arguments as AttrSets You can also pass default arguments But functions take exactly what they define. Nothing more, nothing less. ```nix > add = {x, y ? 2}: x+y > add {x = 2;} > 4 > add {x=2; y=3} > 5 ``` If you want other thigs you can do it this way ```nix > add = s@{x, y, ...}: x + y + s.z > add {x=2;y=2;z=1;a=1;} > 5 ``` = Builtins = Nix comes with a lot of builtin functions, but doesn't want to pollute scope. So most the functions are scoped under `builtins.` https://nixos.org/manual/nix/stable/#ssec-builtins = Derivations = One of the functions that Nix includes in all scopes is the `derivation` function It takes a few arguments, does some Nix magic, and produces a `Derivation`. Kinda like a .o file in C or the .class file in Java. It's not quite a real package yet. Nix still needs to build it builder name output = Nixpkgs = nix-store = Building process = /tmp $PATH, $HOME outs = Flakes = = NixOS = Modules