Saya memiliki pengetahuan yang lewat tentang Lisps lain (khususnya Skema) dari jalan kembali. Baru-baru ini saya telah membaca tentang Clojure . Saya melihat bahwa ia memiliki "simbol" dan "kata kunci". Simbol yang saya kenal, tetapi tidak dengan kata kunci.
Apakah Lisps lain memiliki kata kunci? Bagaimana kata kunci berbeda dari simbol selain memiliki notasi yang berbeda (yaitu: titik dua)?
Jawaban:
Berikut dokumentasi Clojure untuk Kata Kunci dan Simbol.
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
danSymbol.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.
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.
Kata kunci bukan milik ruang nama apa pun kecuali Anda secara khusus memenuhi syarat:
(Terima kasih Rainer Joswig karena memberi saya ide tentang berbagai hal untuk dilihat.)
sumber
(eval (eval ':a))
vs(eval (eval ''a))
. Apakah ada kelebihan lain? Kinerja bijaksana, mereka identik?Lisp umum memiliki simbol kata kunci.
Kata kunci juga simbol.
Apa yang membuat kata kunci istimewa:
Kalau tidak, kata kunci adalah simbol biasa. Jadi kata kunci dapat memberi nama fungsi atau memiliki daftar properti.
Ingat: dalam Common Lisp, simbol milik sebuah paket. Ini dapat ditulis sebagai:
Untuk simbol kata kunci yang berarti: foo, kata kunci: foo dan kata kunci :: foo semuanya adalah simbol yang sama. Jadi dua notasi terakhir biasanya tidak digunakan.
Jadi: foo hanya diuraikan dalam paket KEYWORD, dengan asumsi bahwa tidak memberikan nama paket sebelum nama simbol berarti secara default paket KEYWORD.
sumber
Kata kunci adalah simbol yang mengevaluasi untuk diri mereka sendiri, jadi Anda tidak harus ingat untuk mengutipnya.
sumber
: kata kunci juga diperlakukan secara khusus oleh banyak koleksi, memungkinkan beberapa sintaks yang sangat nyaman.
sama dengan
ini membuat semuanya sedikit lebih fleksibel
sumber
Untuk kata kunci, nilai hash dihitung dan di-cache ketika kata kunci pertama kali dibuat. Saat mencari kata kunci sebagai kunci hash, itu hanya mengembalikan nilai hash yang dihitung sebelumnya. Untuk string dan simbol, hash dihitung ulang pada setiap pencarian.
Mengapa kata kunci dengan nama yang sama selalu identik, mereka berisi nilai hash mereka sendiri. Karena pencarian di peta dan set dibuat dari kunci hash, ini meningkatkan efisiensi pencarian yang lebih baik jika banyak pencarian, bukan dalam pencarian itu sendiri.
sumber
Kata kunci bersifat global , simbol tidak .
Contoh ini ditulis dalam JavaScript, tapi saya harap ini membantu untuk menjelaskan maksudnya.
Ketika Anda membangun simbol menggunakan
Symbol
fungsi Anda mendapatkan simbol yang berbeda / pribadi setiap kali. Ketika Anda meminta simbol melaluiSymbol.for
fungsi, Anda akan mendapatkan kembali simbol yang sama setiap kali.Semuanya sama saja.
Nama argumen fungsi adalah lokal. yaitu bukan kata kunci.
sumber