3. Nix 式
nix repl
Section titled “nix repl”Nix CLI には、 REPL (Read-Eval-Print Loop = ブラウザのコンソールのように対話形式で実行する形式) が用意されています。
nix replREPL から退出
Section titled “REPL から退出”ctrl + D で REPL を閉じます。
Nix 式評価の基本
Section titled “Nix 式評価の基本”Nix 式は、多くの関数型言語と同じように、遅延評価されます。
数値
1# -> 12 * 3# -> 3文字列
"hello, " + "nix"# -> "hello, nix"# 複数行使う場合は '' を使う''multi-linestring''# -> "multi-line\nstring\n"リスト
[ 1 2 ]# -> [ 1 2 ][ 1 2 ] ++ [ 3 4 ]# -> [ 1 2 3 4]論理値
true# -> true!true# -> falselet ... in 構文
Section titled “let ... in 構文”いわゆる「変数」を定義できます。なお、Nix は関数型言語なので、変数の変更はできません。
let a = 3;in a + 2;# -> 5続けて書くことも、 let の中の他のメンバーを参照することもできます。
let b = a + 2; a = 3;in a + b# -> 8Attrset
Section titled “Attrset”文字列 -> 任意の値の対応を記述するものです。 JavaScript でいうオブジェクトや Map のようなものです。
{ a = 1; b = 2;}# -> { a = 1; b = 2; }もちろん、アトリビュート (プロパティ) にアクセスすることもできます。
let attrset = { a = 1; b = 2; };in attrset.b# -> 2rec キーワードを使うと、自身のメンバーにアクセスできます。
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 # -> 5Nix では、パスも基本型の一つです。
(前準備: path.txt というファイルを作業ディレクトリに作成し、hello path と書き込んでおいてください。)
builtins.readFile ./path.txt# -> "hello path\n"