Berikut dokumentasi Clojure untuk Kata Kunci dan Simbol.
Kata kunci adalah pengidentifikasi simbolis yang mengevaluasi diri mereka sendiri. Mereka menyediakan tes kesetaraan yang sangat cepat ...
Simbol adalah pengidentifikasi yang biasanya digunakan untuk merujuk ke sesuatu yang lain. Mereka dapat digunakan dalam bentuk program untuk merujuk ke parameter fungsi, biarkan binding, nama kelas dan vars global ...
Kata kunci umumnya digunakan sebagai "string konstan" yang ringan, misalnya untuk kunci peta hash atau nilai pengiriman multimethod. Simbol umumnya digunakan untuk memberi nama variabel dan fungsi dan itu kurang umum untuk memanipulasi mereka sebagai objek langsung kecuali dalam makro dan semacamnya. Tetapi tidak ada yang menghentikan Anda dari menggunakan simbol di mana pun Anda menggunakan kata kunci (jika Anda tidak keberatan mengutipnya sepanjang waktu).
Cara termudah untuk melihat perbedaannya adalah membaca Keyword.java
dan Symbol.java
sumber Clojure. Ada beberapa perbedaan implementasi yang jelas. Misalnya Simbol di Clojure dapat memiliki metadata dan Kata Kunci tidak bisa.
Selain sintaks kolon tunggal, Anda dapat menggunakan kolon ganda untuk membuat kata kunci yang memenuhi syarat namespace.
user> :foo
:foo
user> ::foo
:user/foo
Lisp umum memiliki kata kunci, seperti halnya Ruby dan bahasa lainnya. Mereka sedikit berbeda dalam bahasa-bahasa itu tentu saja. Beberapa perbedaan antara kata kunci Common Lisp dan kata kunci Clojure:
Kata kunci dalam Clojure bukan Simbol.
user> (symbol? :foo)
false
Kata kunci bukan milik ruang nama apa pun kecuali Anda secara khusus memenuhi syarat:
user> (namespace :foo)
nil
user> (namespace ::foo)
"user"
(Terima kasih Rainer Joswig karena memberi saya ide tentang berbagai hal untuk dilihat.)