Pernyataan With
Pola umum saat membuat objek adalah memanggil serangkaian fungsi dan mengatur serangkaian properti segera setelah objek dibuat.
Hal ini menyebabkan nama objek diulang berkali-kali di kode, menambah noise yang tidak perlu. Solusi umum untuk ini adalah meneruskan tabel sebagai argumen yang berisi kumpulan kunci dan nilai untuk ditimpa. Kekurangannya adalah konstruktor objek harus mendukung bentuk ini.
Blok with membantu mengatasi hal ini. Di dalam blok with, kita bisa menggunakan pernyataan khusus yang diawali dengan . atau \ yang merepresentasikan operasi tersebut diterapkan pada objek yang sedang dipakai.
Sebagai contoh, kita bekerja dengan objek yang baru dibuat:
with Person! .name = "Oswald" \add_relative my_dad \save! print .namewith Person! .name = "Oswald" \add_relative my_dad \save! print .namePernyataan with juga bisa digunakan sebagai ekspresi yang mengembalikan nilai yang diberi akses.
file = with File "favorite_foods.txt" \set_encoding "utf8"file = with File "favorite_foods.txt" \set_encoding "utf8"Ekspresi with mendukung break dengan satu nilai:
result = with obj break .valueresult = with obj break .valueSetelah break value digunakan di dalam with, ekspresi with tidak lagi mengembalikan objek targetnya, melainkan mengembalikan nilai dari break.
a = with obj .x = 1-- a adalah obj
b = with obj break .x-- b adalah .x, bukan obja = with obj .x = 1-- a adalah obj
b = with obj break .x-- b adalah .x, bukan objBerbeda dari for / while / repeat / do, with hanya mendukung satu nilai break.
Atau…
create_person = (name, relatives) -> with Person! .name = name \add_relative relative for relative in *relatives
me = create_person "Leaf", [dad, mother, sister]create_person = (name, relatives) -> with Person! .name = name \add_relative relative for relative in *relatives
me = create_person "Leaf", [dad, mother, sister]Dalam penggunaan ini, with dapat dilihat sebagai bentuk khusus dari kombinator K.
Ekspresi pada pernyataan with juga bisa berupa assignment jika Anda ingin memberi nama pada ekspresi tersebut.
with str := "Hello" print "original:", str print "upper:", \upper!with str := "Hello" print "original:", str print "upper:", \upper!Anda bisa mengakses kunci khusus dengan [] di dalam pernyataan with.
with tb [1] = 1 print [2] with [abc] [3] = [2]\func! ["key-name"] = value [] = "abc" -- menambahkan ke "tb"with tb [1] = 1 print [2] with [abc] [3] = [2]\func! ["key-name"] = value [] = "abc" -- menambahkan ke "tb"with? adalah versi yang ditingkatkan dari sintaks with, yang memperkenalkan pengecekan keberadaan untuk mengakses objek yang mungkin nil secara aman tanpa pemeriksaan null eksplisit.
with? obj print .namewith? obj print .name