Nix言語
Nix関係の全ての設定やderivationはこのNix Expression Languageで書く
強い動的型付き
拡張子は.nix
変わった仕様が多いので込み入ったことをしようとするとハマるかも知れない(悪い意味で)mrsekut.icon
文法など基本事項
標準関数など
Identifier
-を識別子に使える
a-やa-bという変数を定義できる
packageのnameに-を使うことが多いので便利
Strings
文字列は、"foo"か''foo''のいずれかで書く
'foo'という書き方はできない
''fo"o''のように文字列の内部に"を含めたいときとかに使う
このfooの中身は文字列でないといけない
interpolationをescapeするためには以下のように書く
code:nix
nix-repl> "\${foo}"
"${foo}"
nix-repl> ''test ''${foo} test''
"test ${foo} test"
これは覚えられる気がしないmrsekut.icon
Lists
カンマは不要
[ 2 "foo" true (2+3) ]
immutableである
let..in
;が必要
code:nix
let a = "foo"; in a
let a = 3; b = 4; in a + b
with
これを
code:nix-repl
nix-repl> longName = { a = 3; b = 4; }
nix-repl> longName.a + longName.b
7
こう書ける
code:nix-repl
nix-repl> with longName; a + b
7
これはかなり頻繁に見かけるmrsekut.icon
名前が重複した場合は、Attribute Setsじゃない方の変数が優先される
code:nix-repl
nix-repl> longName = { a = 3; b = 4; }
nix-repl> let a = 10; in with longName; a + b
14
nix-repl> let a = 10; in with longName; longName.a + b
7
わからんでもないが、ややこしいなmrsekut.icon
inherit
code:nix repl
nix-repl> add = { a ? 3, b }: a+b
nix-repl> values = { a = 3; b = 5; }
nix-repl> with values; add { inherit a b; }
8
無名関数
x: x*2
hsでの\x -> x * 2と同じ意味
:の後にスペースがないと文字列になるmrsekut.icon
識別子として利用できるわけでもない
code:nix-repl
nix-repl> { foo = a:x; }
{ foo = "a:x"; }
束縛する
code:nix-repl
nix-repl> double = x: x*2
nix-repl> double
«lambda»
nix-repl> double 3
6
hsと同じノリで2引数関数と部分適用ができる
code:nix-repl
nix-repl> mul = a: b: a*b
nix-repl> mul
«lambda»
nix-repl> mul 3
«lambda»
nix-repl> mul 3 4
12
関連
参考
他の関数型言語とは異なる部分のみを取り上げて紹介されている
文法
<hoge>ってなに?
e.g. let localconfig = import <localconfig>;
inherit statement
inheritってなに?
関数じゃなくて構文っぽいが(syntax highligh的に)
できるらしい
import関数
.nixのfileを読み込む
import path/to/file {};
慣用表現
scriptのpathを取得
${builtins.toString ./.}
あるdir内の、dir名一覧を取得
path: map (d: ./. + "/${d}") (builtins.attrNames (builtins.readDir path)); ref 型
integer, floating point, string, path, boolean and null
simple types
lists
sets
functions
Functo, Monadなどの型を定義しているrepo
良い感じの関数結合ってないの?
.nix内で$USERみたいに、shell変数使いたい