basant/basant/raw/nix-lang.wiki

83 lines
1.5 KiB
Plaintext

%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
{
<attributes> = ...;
}
```
= 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