Pertanyaan Bagaimana konvensi penamaan `* var-name *` yang digunakan dalam clojure?


Sebagai orang yang tidak berbisik datang untuk menjelaskan bagaimana sebaiknya saya memahami konvensi penamaan di mana vars mendapatkan nama seperti *var-name*?

Ini tampaknya merupakan konvensi cadel yang menunjukkan variabel global. Namun dalam clojure, var semacam itu muncul di ruang nama sejauh yang bisa saya katakan.

Saya akan sangat menghargai penjelasan singkat tentang apa yang harus saya harapkan ketika seorang penulis telah menggunakan var semacam itu dalam kode mereka, idealnya dengan contoh bagaimana dan mengapa var semacam itu akan digunakan dan diubah dalam perpustakaan clojure.


32
2017-12-31 20:20


asal


Jawaban:


Ini adalah konvensi yang digunakan dalam Lisps lainnya, seperti Common Lisp, untuk membedakannya variabel khusus, sebagai berbeda dari variabel leksikal. SEBUAH khusus atau dinamis variabel memiliki pengikatannya yang disimpan dalam lingkungan yang dinamis, yang berarti bahwa nilainya saat ini dapat dilihat oleh titik mana pun dalam kode bergantung pada bagaimana ia dapat terikat lebih tinggi pada tumpukan panggilan, dibandingkan dengan hanya bergantung pada bentuk pengikatan leksikal lokal (seperti let atau defn).

Perhatikan bahwa dalam bukunya Biarkan Lebih Lambda, Doug Hoyte berpendapat menentang konvensi asterix "penutup telinga" untuk penamaan variabel khusus. Dia menggunakan gaya makro yang tidak biasa yang membuat referensi ke variabel bebas, dan dia lebih suka tidak berkomitmen atau membedakan apakah simbol-simbol itu pada akhirnya akan merujuk ke variabel leksikal atau dinamis.

Meskipun ditargetkan khusus pada Common Lisp, Anda mungkin menikmati Ron Garretesai Panduan Idiot untuk Variabel Khusus. Banyak yang masih bisa diterapkan ke Clojure.


18
2017-12-31 20:46



Pemrograman fungsional adalah semua tentang fungsi yang dapat diprediksi aman. Infact beberapa dari kita takut akan hal yang menyeramkan.tindakan dari jauh"hal. Ketika orang-orang memanggil fungsi mereka mendapat kepuasan fuzzy hangat bahwa fungsi akan selalu memberi mereka hasil yang sama jika mereka memanggil fungsi atau membaca nilai lagi. *un-warm-and-fuzzy* hal-hal bristly ada untuk memperingatkan programmer bahwa variabel ini kurang suka diemong dari beberapa yang lain.


16
2018-01-06 00:31



Beberapa referensi yang saya temukan di newsgroup Clojure:

Re: membuat kode dapat dibaca   John D. Hume   Selasa, 30 Des 2008 08:30:57 -0800

Pada Senin, 29 Desember 2008, pukul 16.10, Chouser menulis:   Saya percaya idiom untuk nilai-nilai global seperti ini adalah untuk menempatkan tanda bintang   sekitar nama.

Saya pikir konvensi asterisk adalah untuk variabel yang ditujukan untuk   mengikat dinamis. Aku butuh satu menit untuk mencari tahu di mana aku mendapatkannya   ide. "Pemrograman Clojure" menyarankan itu (tanpa cukup mengucapkannya) di   bab 6, bagian 3.

"Vars yang ditujukan untuk pengikatan dinamis terkadang disebut sebagai variasi khusus
    ables. Ini adalah gaya yang bagus untuk menamai mereka     dengan asterisks terkemuka dan trailing. "

Tentunya buku itu sedang dalam proses, tetapi itu memang terdengar   masuk akal. Konvensi khusus untuk variabel yang nilainya berubah (atau   bahwa sambutan kode saya untuk mengulang) tampaknya lebih berguna bagi saya daripada untuk   "globals" (meskipun saya tidak yakin saya akan mempertimbangkan sesuatu seperti ukuran kisi   untuk aplikasi yang diberikan secara global). Berdasarkan ants.clj tampak Rich   tidak merasa perlu ada konvensi penamaan khusus untuk itu   semacam nilai.

dan...

Saya percaya idiom untuk nilai-nilai global seperti ini adalah untuk menempatkan tanda bintang   sekitar nama. Setrip bawah (dan CamelCase) hanya boleh digunakan saat   diperlukan untuk interop Java:

(def *grid-size* 10)
(def *height* 600)
(def *margin* 50)
(def *x-index* 0)
(def *y-index* 1)

6
2017-12-31 20:41