Nix Series: Basic Nix Language
Source: Dev.to
Pada series sebelumnya, kita sudah melakukan instalasi nix di VirtualBox dan setup SSH agar dapat diakses diluar VirtualBox. Sebelum kita lanjut untuk melakukan konfigurasi system lagi, kita butuh mengetahui bagaimana syntax dalam menulis program Nix dan di artikel ini kita akan mempelajari dasar syntax-nya.
Nix Language
Nix adalah purely functional language yang lazy-evaluated, digunakan untuk mengkonfigurasi Nix package manager dan NixOS. Karakteristik utama:
Purely functional: sebuah function hanya bisa mengembalikan nilai berdasarkan inputnya, tidak bisa mengubah variabel di luar scope-nya (no side effects), dan tidak ada variabel yang bisa diubah setelah didefinisikan (no mutation). Kalau kamu familiar dengan const di beberapa bahasa pemrograman, semua variabel di Nix berperilaku seperti itu.
Lazy evaluation: Nix tidak menghitung nilai suatu ekspresi sampai nilai itu benar-benar dibutuhkan. Ini artinya kamu bisa mendefinisikan ribuan package di nixpkgs tanpa semuanya dievaluasi sekaligus. Hanya yang kamu gunakan saja yang akan diproses.
Semua adalah expression: tidak ada statement di Nix, setiap baris kode selalu menghasilkan sebuah nilai. if/else bukan statement seperti di bahasa pemrograman pada umumnya, melainkan expression yang harus mengembalikan nilai dari kedua cabangnya.
Tidak ada loops: karena variabel tidak bisa diubah, loop seperti for atau while tidak ada artinya di Nix. Sebagai gantinya, kamu menggunakan fungsi seperti map dan filter, atau rekursi untuk mengolah kumpulan data.
- Basic Data Type
Konsep JavaScript Nix
String
"hello"
"hello"
Number
42, 3.14
42, 3.14
Boolean
true, false
true, false
Null
null
null
List
[1, 2, 3]
[ 1 2 3 ]
Object
{ a: 1 }
{ a = 1; }
⚠️ Perbedaan Penting
-
List di Nix menggunakan spasi sebagai pemisah, bukan koma
-
Attribute set menggunakan
=bukan:, dan setiap entry diakhiri dengan;
Nix
let
name = "Alice";
age = 30;
scores = [ 10 20 30 ];
person = { name = "Bob"; age = 25; };
in
person
Enter fullscreen mode
Exit fullscreen mode
Javascript
const name = "Alice";
const age = 30;
const scores = [10, 20, 30];
const person = { name: "Bob", age: 25 };
Enter fullscreen mode
Exit fullscreen mode
2. String
Nix memiliki beberapa cara dalam mendifinisikan string:
# String biasa
"Hello, World"
# String multiline (menggunakan '' bukan backtick)
''
Hello
World
''
# String interpolation, menggunakan ${} seperti template literal di JS
let name = "Alice";
in "Hello, ${name}!" # -> "Hello, Alice!"
Enter fullscreen mode
Exit fullscreen mode
3. let … in (Variable Binding)
Nix tidak punya var/const/let seperti di JS. Sebagai gantinya, kamu pakai blok let ... in. Anggap saja ini sebagai blok yang punya scope dan mengembalikan sebuah nilai.
Nix:
# Keseluruhan ekspresi ini menghasilkan "Hello, Alice!"
let
greeting = "Hello";
name = "Alice";
in
"${greeting}, ${name}!"
Enter fullscreen mode
Exit fullscreen mode
4. Attribute Sets
let
person = {
name = "Alice";
age = 30;
};
in
person.name # -> "Alice" (dot access, sama seperti JS!)
Enter fullscreen mode
Exit fullscreen mode
rec - Recursive Attribute Sets
Di JS, kamu bisa mereferensikan this.x di dalam sebuah object. Di Nix, gunakan rec:
# Tanpa rec, ini akan ERROR karena b tidak bisa melihat a
rec {
a = 10;
b = a * 2; # -> 20 ✅
}
Enter fullscreen mode
Exit fullscreen mode
with - Membawa Attributes ke Scope Saat Ini
let person = { name = "Alice"; age = 30; };
in
with person;
"Name: ${name}, Age: ${toString age}"
Enter fullscreen mode
Exit fullscreen mode
5. Functions
Di Nix, semua function hanya menerima satu argumen. Untuk multiple argumen,.
Satu Argumen
let
greet = name: "Hello, ${name}!";
in
greet "Alice" # -> "Hello, Alice!"
# ^^^^^^ tidak perlu tanda kurung untuk memanggil function!
Enter fullscreen mode
Exit fullscreen mode
Attribute Set sebagai Argumen (Destructured Params)
Cara ini cocok jika kamu memerlukan beberapa argument pada function
let
greet = { name, age }: "I'm ${name}, ${toString age} years old";
in
greet { name = "Alice"; age = 30; }
Enter fullscreen mode
Exit fullscreen mode
Default Argumen
let
greet = { name, greeting ? "Hello" }: "${greeting}, ${name}!";
in
greet { name = "Alice"; } # -> "Hello, Alice!"
Enter fullscreen mode
Exit fullscreen mode
6. Conditionals
if/else di Nix bekerja berbeda dari JavaScript. Di JS, if adalah sebuah statement yang mengeksekusi blok kode. Di Nix, if adalah sebuah expression yang menghasilkan nilai, persis seperti ternary operator di JS.
let age = 20;
in
if age >= 18 then "adult" else "minor"
Enter fullscreen mode
Exit fullscreen mode
ℹ️ if/else di Nix selalu butuh cabang else karena ini adalah expression yang harus menghasilkan nilai!
inherit- Shorthand untuk Attribute Sets
Mirip seperti shorthand property name di JS, { name } alih-alih menulis { name: name }.
let
name = "Alice";
age = 30;
in {
inherit name age; # sama dengan: name = name; age = age;
}
Enter fullscreen mode
Exit fullscreen mode
8. import - Memisahkan File
# math.nix
{
add = x: y: x + y;
mul = x: y: x * y;
}
# main.nix
let
math = import ./math.nix;
in
math.add 3 4 # -> 7
Enter fullscreen mode
Exit fullscreen mode
Evaluating and Testing Nix Code
Setelah mengetahui syntaxnya, kamu bisa coba-coba untuk evaluate kode nix dengan nix tools berikut:
Tool Kegunaan Butuh file?
nix repl
Scratch pad interaktif, uji syntax secara langsung
Tidak
nix eval --expr
One-liner cepat dari terminal
Tidak
nix-instantiate --eval
Evaluasi file .nix standalone
Ya
nix eval .#attr
Inspeksi nilai output dari flake
Ya (flake)
nix build / nix run
Build dan jalankan package dari flake Ya (flake)
Contoh penggunaan nix repl:
💡 Perintah berguna di dalam REPL
-
:quntuk keluar dari REPL -
:luntuk load nixpkgs sehingga bisa aksespkgs.nodejsdll. -
:tuntuk melihat tipe dari sebuah ekspresi -
:?untuk melihat semua perintah yang tersedia
Contoh evaluate nix file, buat default.nix:
let
greeting = "Hello";
name = "Alice";
in
"${greeting}, ${name}!"
Enter fullscreen mode
Exit fullscreen mode
evaluate dengan nix-instantiate --eval
Penutup
Setelah kita mengetahui syntax dasar nix, pada series selanjutnya kita akan melanjutkan konfigurasi security hardening

