Skip to content

3. Nix 式

Nix CLI には、 REPL (Read-Eval-Print Loop = ブラウザのコンソールのように対話形式で実行する形式) が用意されています。

Terminal window
nix repl

ctrl + D で REPL を閉じます。

Nix 式は、多くの関数型言語と同じように、遅延評価されます。

数値

1
# -> 1
2 * 3
# -> 3

文字列

"hello, " + "nix"
# -> "hello, nix"
# 複数行使う場合は '' を使う
''
multi-line
string
''
# -> "multi-line\nstring\n"

リスト

[ 1 2 ]
# -> [ 1 2 ]
[ 1 2 ] ++ [ 3 4 ]
# -> [ 1 2 3 4]

論理値

true
# -> true
!true
# -> false

いわゆる「変数」を定義できます。なお、Nix は関数型言語なので、変数の変更はできません。

let
a = 3;
in a + 2;
# -> 5

続けて書くことも、 let の中の他のメンバーを参照することもできます。

let
b = a + 2;
a = 3;
in a + b
# -> 8

文字列 -> 任意の値の対応を記述するものです。 JavaScript でいうオブジェクトや Map のようなものです。

{
a = 1;
b = 2;
}
# -> { a = 1; b = 2; }

もちろん、アトリビュート (プロパティ) にアクセスすることもできます。

let
attrset = {
a = 1;
b = 2;
};
in
attrset.b
# -> 2

rec キーワードを使うと、自身のメンバーにアクセスできます。

rec {
a = 5;
b = a + 3;
}
# -> { a = 5; b = 8; }
# 引数をひとつとる関数
let
fn = arg: arg + 1;
# -> «lambda @ «string»:1:1»
in
# 関数の呼び出し
fn 2
# -> 3
# 組み込み関数
toString 2
# -> "2"

よくある関数言語のように、Nix の関数は引数を一つしかとれないので、複数の引数をとる関数を定義する場合は、Attrset を使うか「カリー化」をします。

# attrset をとる例
let
# 引数を分解することもできる
add = { a, b }: a + b;
in
add { a = 2; b = 3; }
# -> 5
# カリー化する例
let
# カリー化された関数: 返り値をもう一度呼び出して解を得る
add = a: b: a + b;
in
add 2 3
# -> 5

Nix では、パスも基本型の一つです。

(前準備: path.txt というファイルを作業ディレクトリに作成し、hello path と書き込んでおいてください。)

builtins.readFile ./path.txt
# -> "hello path\n"