3. Nix 式
nix repl
Section titled “nix repl”Nix CLI には、 REPL (Read-Eval-Print Loop = ブラウザのコンソールのように対話形式で実行する形式) が用意されています。
nix repl
REPL から退出
Section titled “REPL から退出”ctrl
+ D
で REPL を閉じます。
Nix 式評価の基本
Section titled “Nix 式評価の基本”Nix 式は、多くの関数型言語と同じように、遅延評価されます。
数値
1# -> 1
2 * 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# -> false
let ... in
構文
Section titled “let ... in 構文”いわゆる「変数」を定義できます。なお、Nix は関数型言語なので、変数の変更はできません。
let a = 3;in a + 2;# -> 5
続けて書くことも、 let
の中の他のメンバーを参照することもできます。
let b = a + 2; a = 3;in a + b# -> 8
Attrset
Section titled “Attrset”文字列 -> 任意の値の対応を記述するものです。 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"