Overview of the Nix Language: Difference between revisions
imported>Samueldr m quoting with blockquote |
imported>Ixxie Restructured page |
||
Line 4: | Line 4: | ||
This [[:Category:Discussion|discussion]] article covers the syntax, semantics, typing, compilation, tooling and libraries of the Nix Expression Language. | This [[:Category:Discussion|discussion]] article covers the syntax, semantics, typing, compilation, tooling and libraries of the Nix Expression Language. | ||
<blockquote>The Nix expression language is a pure, lazy, functional language. Purity means that operations in the language don't have side-effects (for instance, there is no variable assignment). Laziness means that arguments to functions are evaluated only when they are needed. Functional means that functions are “normal” values that can be passed around and manipulated in interesting ways. The language is not a full-featured, general purpose language. Its main job is to describe packages, compositions of packages, and the variability within packages.</blockquote> | <blockquote>The Nix expression language is a pure, lazy, functional language. Purity means that operations in the language don't have side-effects (for instance, there is no variable assignment). Laziness means that arguments to functions are evaluated only when they are needed. Functional means that functions are “normal” values that can be passed around and manipulated in interesting ways. The language is not a full-featured, general purpose language. Its main job is to describe packages, compositions of packages, and the variability within packages.</blockquote> | ||
<cite>— From the [https://nixos.org/nix/manual/#ch-expression-language nix manual]</cite> | <cite>— From the [https://nixos.org/nix/manual/#ch-expression-language nix manual]</cite> | ||
Line 10: | Line 9: | ||
The language was designed especially for the [[Nix Package Manager]]. | The language was designed especially for the [[Nix Package Manager]]. | ||
== | == Language Features == | ||
TODO - feature overview | |||
=== Expressions === | |||
TODO | |||
=== Types === | |||
TODO | |||
=== Functions === | |||
TODO | |||
=== Notable | === Notable Constructs === | ||
Nix looks a lot like JSON with functions but also provides a number of very specialized constructs which can help you build clean and easy to read expressions. In this sub-chapter the most notable constructs will be shown by example: | Nix looks a lot like JSON with functions but also provides a number of very specialized constructs which can help you build clean and easy to read expressions. In this sub-chapter the most notable constructs will be shown by example: | ||
Line 114: | Line 122: | ||
TODO | TODO | ||
== Syntax Highlighting | == Learning Resources == | ||
The [https://nixos.org/nix/manual/#ch-expression-language manual] provides a '''reference''' of the Nix language. All language constructs you may use in nix are defined here, together with code snippets. | |||
[https://medium.com/@MrJamesFisher/nix-by-example-a0063a1a4c55 Nix By Example] is a step-by-step tutorial. | |||
The [https://nixos.org/nixos/nix-pills/index.html nix pills] also provide a lot of insight into the language and functional package management in general. | |||
== Development Tools == | |||
=== Syntax Highlighting & Editor Modes === | |||
Nix language has decent syntax highlighting (SH) support among popular code editors, but refactoring/autocomplete is still rare. | Nix language has decent syntax highlighting (SH) support among popular code editors, but refactoring/autocomplete is still rare. | ||
Revision as of 20:42, 9 October 2017
This discussion article covers the syntax, semantics, typing, compilation, tooling and libraries of the Nix Expression Language.
The Nix expression language is a pure, lazy, functional language. Purity means that operations in the language don't have side-effects (for instance, there is no variable assignment). Laziness means that arguments to functions are evaluated only when they are needed. Functional means that functions are “normal” values that can be passed around and manipulated in interesting ways. The language is not a full-featured, general purpose language. Its main job is to describe packages, compositions of packages, and the variability within packages.
— From the nix manual
The language was designed especially for the Nix Package Manager.
Language Features
TODO - feature overview
Expressions
TODO
Types
TODO
Functions
TODO
Notable Constructs
Nix looks a lot like JSON with functions but also provides a number of very specialized constructs which can help you build clean and easy to read expressions. In this sub-chapter the most notable constructs will be shown by example:
with
statement
The with
statement introduces the lexical scope of a set into the expression which follows.
Common usages are:
On top of expressions
You will see the with statement a lot at the beginning of expression definition. Most of the time it is used to load the lib functions into the namespace for quick access.
{lib, ... }:
with lib;
{
options = {
networking.hosts = mkOption {
type = with types; attrsOf ( listOf str);
default = {};
};
};
...
}
instead of:
{lib, ... }:
{
options = {
networking.hosts = lib.mkOption {
type = lib.types.attrsOf ( lib.types.listOf lib.types.str);
default = {};
};
};
...
}
In package input definitions
{pkgs}:
{
...
buildInputs = with pkgs; [ curl php coreutils procps ffmpeg ];
}
Instead of :
{pkgs}:
{
...
buildInputs = [ pkgs.curl pkgs.php pkgs.coreutils pkgs.procps pkgs.ffmpeg ];
}
In the package meta tag
{stdenv, ...}:
{
...
meta = with stdenv.lib; {
license = with licenses; [ lgp3 gpl3 ];
maintainers = with maintainers; [ adisbladis lassulus ];
};
}
Instead of :
{stdenv, ...}:
{
...
meta = {
license = [ stdenv.lib.licenses.lgp3 stdenv.lib.licenses.gpl3 ];
maintainers = [ stdenv.lib.maintainers.adisbladis stdenv.lib.maintainers.lassulus ];
};
}
In a default.nix of an external package
with import <nixpkgs> {};
stdenv.mkDerivation rec {
name = "mytool-env";
src = ./.;
buildInputs = with pkgs;[
python34
python34Packages.docopt
];
shellHook =''
export HISTFILE=$PWD/histfile
'' ;
}
let ... in
statement
TODO
inherit
statement
TODO
rec
statement
TODO
Learning Resources
The manual provides a reference of the Nix language. All language constructs you may use in nix are defined here, together with code snippets.
Nix By Example is a step-by-step tutorial. The nix pills also provide a lot of insight into the language and functional package management in general.
Development Tools
Syntax Highlighting & Editor Modes
Nix language has decent syntax highlighting (SH) support among popular code editors, but refactoring/autocomplete is still rare.
Reference: Editor Modes for Nix Files