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
constdi 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/elsebukan 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
foratauwhiletidak ada artinya di Nix. Sebagai gantinya, kamu menggunakan fungsi sepertimapdanfilter, atau rekursi untuk mengolah kumpulan data.
1. 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
Javascript
const name = "Alice";
const age = 30;
const scores = [10, 20, 30];
const person = { name: "Bob", age: 25 };
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!"
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}!"
4. Attribute Sets
let
person = {
name = "Alice";
age = 30;
};
in
person.name # -> "Alice" (dot access, sama seperti JS!)
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 ✅
}
with - Membawa Attributes ke Scope Saat Ini
let person = { name = "Alice"; age = 30; };
in
with person;
"Name: ${name}, Age: ${toString age}"
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!
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; }
Default Argumen
let
greet = { name, greeting ? "Hello" }: "${greeting}, ${name}!";
in
greet { name = "Alice"; } # -> "Hello, Alice!"
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"
ℹ️
if/elsedi Nix selalu butuh cabang else karena ini adalah expression yang harus menghasilkan nilai!
7. 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;
}
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
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:l <nixpkgs>untuk load nixpkgs sehingga bisa aksespkgs.nodejsdll.:t <expr>untuk 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}!"
evaluate dengan nix-instantiate --eval
Penutup
Setelah kita mengetahui syntax dasar nix, pada series selanjutnya kita akan melanjutkan konfigurasi security hardening


Top comments (0)