forked from Skynet/wiki
assignment: added section on the nix programming language
This commit is contained in:
parent
d98c090fb7
commit
550748da77
2 changed files with 59 additions and 4 deletions
BIN
_git.tar.gz
(Stored with Git LFS)
BIN
_git.tar.gz
(Stored with Git LFS)
Binary file not shown.
|
@ -17,14 +17,67 @@ In a sense updating one program can break another on the system.
|
||||||
The route the Nix package manager takes is it treats each program as a function.
|
The route the Nix package manager takes is it treats each program as a function.
|
||||||
Using teh Nix language a function for that package is created which states what inputs are required, what is needed to turn those inputs into teh program as well as the name for the output.
|
Using teh Nix language a function for that package is created which states what inputs are required, what is needed to turn those inputs into teh program as well as the name for the output.
|
||||||
The output is then saved in a read only location in the format of ``/nix/store/$hash-program-name-version``.
|
The output is then saved in a read only location in the format of ``/nix/store/$hash-program-name-version``.
|
||||||
This output can eitehr be used as the input of another program or be used as is by the system/user.
|
This output can either be used as the input of another program or be used as is by the system/user.
|
||||||
Using this format means that any change in the inputs or the program itself will result in a different output.
|
Using this format means that any change in the inputs or the program itself will result in a different output.
|
||||||
This means that multiple versions of the program (some even the same version but different commit) can co-exist on the one system.
|
This means that multiple versions of the program (some even the same version but different commit) can co-exist on the one system.
|
||||||
An example using different versions of Firefox:
|
An example using different versions of Firefox:
|
||||||
![img.png](nix/firefox_co-existing.png)
|
![img.png](nix/firefox_co-existing.png)
|
||||||
|
|
||||||
#### Language
|
#### Language
|
||||||
|
There are two partially difficult problems in computer science:
|
||||||
|
1. Off by one errors
|
||||||
|
2. Caching
|
||||||
|
3. Naming things
|
||||||
|
|
||||||
|
Nix falls into this last pitfall.
|
||||||
|
The programming language used by teh Nix package manager is called Nix, not Nixlang (as like Erlang) but rather the same name as primary tool that uses it.
|
||||||
|
For clarity for teh remainder of this subsection we are only talking about Nix the language.
|
||||||
|
|
||||||
|
Nix is a lazily evaluated functional language which al has REPL (Read, Evaluate, Print, and Loop) capability like what you would see in Python.
|
||||||
|
As a whole it takes strong influences from OCaml and other ML derived languages.
|
||||||
|
|
||||||
|
##### Types
|
||||||
|
It has most of the normal types that you would expect of a programming language, along with a few extra to deal with the filesystem:
|
||||||
|
```nix
|
||||||
|
a = 1 # int
|
||||||
|
b = 1.001 # float
|
||||||
|
c = /path/to/thing # path
|
||||||
|
d = "42" # string
|
||||||
|
e = true # boolean
|
||||||
|
```
|
||||||
|
Of these the ``path`` type will be new to most people.
|
||||||
|
This can take either an absolute or relative path.
|
||||||
|
|
||||||
|
##### Functions
|
||||||
|
If you look at the section below it will seem that these are another type of assignment to a variable.
|
||||||
|
That is half right, these are akin to function pointers that you would see in C or C++.
|
||||||
|
Functions in Nix do not have types for either parameters or return.
|
||||||
|
This is due to it being lazily evaluated, like Python or Javascript.
|
||||||
|
As such the ``double`` function will accept any numeric value
|
||||||
|
```nix
|
||||||
|
double = x: x*2
|
||||||
|
mul = a: b: a*b
|
||||||
|
|
||||||
|
double 2
|
||||||
|
double 4.2
|
||||||
|
mul 7 6
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Attribute Sets
|
||||||
|
In most languages the way to group data would be either an Object or a Struct.
|
||||||
|
Nix has a similar datastructure:
|
||||||
|
```nix
|
||||||
|
s = { foo = "bar"; biz = "baz"; }
|
||||||
|
s.foo # bar
|
||||||
|
s.biz # baz
|
||||||
|
```
|
||||||
|
|
||||||
|
##### More data
|
||||||
|
This is a rough quickstart introduction to Nix.
|
||||||
|
For more detailed information I recommend these resources.
|
||||||
|
|
||||||
|
* [Official Guide][nix_guide_official]
|
||||||
|
* [Nix Pills][nix_guide_pills]
|
||||||
|
|
||||||
### Flakes
|
### Flakes
|
||||||
|
|
||||||
|
@ -55,3 +108,5 @@ An example using different versions of Firefox:
|
||||||
|
|
||||||
[nixos_skynet]: https://forgejo.skynet.ie/Skynet/nixos
|
[nixos_skynet]: https://forgejo.skynet.ie/Skynet/nixos
|
||||||
[nix_paper]: https://edolstra.github.io/pubs/nspfssd-lisa2004-final.pdf
|
[nix_paper]: https://edolstra.github.io/pubs/nspfssd-lisa2004-final.pdf
|
||||||
|
[nix_guide_official]: https://nix.dev/tutorials/first-steps/
|
||||||
|
[nix_guide_pills]: https://nixos.org/guides/nix-pills/#
|
Loading…
Reference in a new issue