Apakah kurung kotak dan kurung kurawal di Clojure masih merupakan ekspresi S?

12

Saya mencoba mempelajari Lisp dan melihat semua Lisps di luar sana dan perbedaannya.

Saya melihat bahwa dalam beberapa implementasi Skema, Anda dapat menggunakan tanda kurung siku secara bergantian dengan tanda kurung agar mudah dibaca, jadi karena mereka diperlakukan sama, saya berasumsi mereka masih hanya ekspresi-S seperti yang lainnya.

Namun, di Clojure saya melihat bahwa kurung siku dan kurung kurawal digunakan untuk mewakili tipe data yang berbeda seperti vektor dan sebagainya. Apakah ini juga masih merupakan ekspresi S yang valid, atau haruskah itu dianggap atom? Bukankah ini "mematahkan" seluruh konsep ekspresi-S, dengan demikian menjadikan Clojure sebuah Lisp "tidak murni"?

mydoghasworms
sumber
Secara teknis "jika tanda kurung siku adalah ekspresi-s, bagaimana Anda bisa mengekspresikannya dengan tanda kurung?" bukan bagian dari pertanyaan, tapi itu yang ingin saya ketahui.
Qwertie

Jawaban:

10

Notasi literal untuk vektor dan peta (yaitu kurung siku dan kurung kurawal) hanyalah gula waktu-baca , dan apa pun yang dapat Anda wakili dengan notasi itu juga dapat diwakili dengan ekspresi S. Akibatnya, tidak ada kehilangan kekuatan atau homoiconicity, dan memang makro pembaca (yang saya mengerti lebih kuat) tersedia di sejumlah lisps.

Secara kebetulan, perhatikan bahwa Clojure sekarang menyediakan mekanisme untuk membuat literal "tag" kustom, yang, seperti literal lainnya, ditransformasikan ke ekspresi S sebelum dikompilasi dan ditafsirkan.

tvachon
sumber
1
Mmm, jawaban Anda membuat saya berpikir bahwa saya kurang mengerti daripada yang saya pikir saya mengerti tentang Lisp. Jadi apa yang Anda katakan (saya pikir) adalah kurung kotak dan keriting sebenarnya bukan ekspresi S itu sendiri. Saya pikir seluruh ide dengan input Lisp adalah bahwa semuanya adalah ekspresi S. Sepertinya saya perlu melakukan penggalian lagi sebelum kembali untuk membaca jawaban Anda lagi. Terima kasih!
mydoghasworms
Itu benar - mereka bukan ekspresi-S. Sintaks Lisp dimulai dengan ekspresi S, di mana segala sesuatu yang dapat diekspresikan dalam bahasa dapat diekspresikan dengan ekspresi S. Tetapi sintaks Lisp tidak berakhir di situ: banyak kompiler Lisp memiliki fase baca-makro eksplisit, di mana pola khusus dalam kode sumber ditransformasikan menjadi ekspresi-S. Ini memungkinkan penulis bahasa menawarkan programmer sintaks yang ramah manusia. Hal penting yang perlu diperhatikan adalah bahwa karena apa pun yang diwakili dengan literal khusus ini juga dapat diwakili dalam ekspresi S, tidak ada manfaat dari homoiconicity yang hilang.
tvachon
3

S-expressions adalah representasi tekstual untuk data. Bilangan, simbol, sel kontra, daftar, string, ... Common Lisp juga memiliki representasi tekstual untuk array, vektor, lebih banyak jenis nomor, karakter, ... Common Lisp juga menyediakan pembaca yang dapat diperluas pengguna, sehingga pengguna dapat menambahkan lebih banyak representasi tekstual untuk tipe data. Terkadang mekanisme ini juga digunakan untuk mengubah sintaksis bahasa pemrograman Lisp (misalnya untuk mendukung ekspresi infix atau pernyataan dari bahasa pemrograman lain).

Jadi, jika dialek Lisp menawarkan representasi tekstual untuk tipe data tambahan, ini cocok dengan gagasan ekspresi-s.

Rainer Joswig
sumber