Dalam [1], Mitchell Wand menunjukkan bahwa menambahkan fexprs ke kalkulus lambda murni meremehkan teori kesetaraan kontekstual, yang berarti dua istilah setara secara kontekstual jika mereka -congruent. Ketika menjelajahi pekerjaan terkait, ia pergi "hasil kami memperluas pengamatan lama Albert Meyer [2] itu dan membuat sepele kesetaraan kontekstual". Tetapi merujuk pada [2], yang dapat ditemukan hanyalah pernyataan berikut dari Meyer:eval
quote
Saya pertama kali berpikir bahwa dalam bahasa dengan fitur
quote
-eval
seperti LISP [3] tidak ada perbedaan jenis antara objek sintaksis dan yang dapat dieksekusi. Bahkanquote
-eval
tampaknya cukup aman di LISP karena, meskipun secaraquote
sintaksis terlihat seperti operator bona fi de, seperti katakancond
, itu benar-benar tidak berperilaku seperti satu (itu hanya memiliki perilaku pada waktu parse, tidak menjalankan waktu, misalnya, seseorang tidak dapat lulusquote
sebagai parameter untuk suatu prosedur). Namun, saya belum melihat contoh meyakinkan di manaquote
-eval
fitur itu berharga.
Terlepas dari satu kelemahan kecil dalam komentar ini yang dapat menyesatkan pembaca untuk menyimpulkan bahwa cond
dapat diteruskan sebagai parameter untuk suatu prosedur. Jika saya mengerti dengan benar, apa yang Meyer katakan " quote
- eval
tampaknya cukup aman" berarti bahwa quote
- eval
mungkin tidak meremehkan teori persamaan, meskipun dia tidak menawarkan bukti.
EDIT:
Seperti yang disarankan oleh Martin, karena ketiga makalah yang dikutip berurusan dengan bahasa keluarga LISP, mari kita letakkan pertanyaan di bawah pengaturan yang sama ini. Apakah kesetaraan kontekstual dari suatu bahasa dengan quote
- eval
, khususnya LISP, di bumi sepele atau tidak?
[1] Mitchell Wand, Teori Fexprs Sepele . Gangguan dan Komputasi Simbolik 10 (3): 189-199 (1998).
[2] Albert Meyer, Puzzles dalam Programming Logic Workshop tentang Pengembangan Perangkat Lunak Formal. 1984
[3] John McCarthy, Fungsi Rekursif Ekspresi simbolik dan Komputasi mereka oleh mesin, Bagian I . Komunikasi ACM pada bulan April 1960.
Jawaban:
Pertama, ini sepenuhnya tergantung pada apa yang Anda ambil sebagai rangkaian konteks Anda. Jika
(quote [])
adalah konteks, maka kesetaraan kontekstual adalah kesetaraan sintaksis.Secara tradisional, konteks untuk kesetaraan kontekstual dianggap sebagai konteks di mana "ekspresi", dalam makna apa pun yang ada dalam bahasa, dapat muncul. Ini mengesampingkan konteks seperti
"[]"
, di mana konteks menempatkan argumennya dalam string literal. Konteks semacam ini juga, IIRC, dikesampingkan oleh Quine ketika ia awalnya menggambarkan transparansi referensial.Dari perspektif ini, saya pikir
(quote [])
juga bukan konteks. Alih-alih, konteksnya adalah tempat di mana evaluasi ekspresi berpotensi terjadi, seperti dalam tubuh fungsi atau dalam argumen aplikasi.Berpotensi bermasalah, ini berarti bahwa dalam program Lisp dengan makro (atau program Racket atau Skema) Anda tidak tahu konteksnya sampai Anda menjalankan proses ekspansi makro yang berpotensi tidak menentu, karena Anda bahkan tidak tahu di mana ekspresi adalah. Apakah Anda berpikir ini adalah masalah atau tidak sebagian besar adalah pertanyaan filosofis daripada pertanyaan teknis.
sumber
(quote [])
, daripada angan-angan, sebagai konteks: menolak gagasan memperlakukan'datum
sebagai gula sintaksis untuk(quote datum)
, kemudian'[]
, karena"[]"
tidak lagi konteks. Macro skema telah mengaburkanquote
.'datum
dan(quote datum)
mengubah apa pun?quote
bahasa dikonstruksi dan'datum
diinginkan(quote datum)
, orang akan cenderung berpendapat bahwa itu(quote [])
adalah konteks. Jika kita menghapusquote
dari bahasa inti, tetapi mendukung literal'datum
sintaks, maka mereka akan cenderung berpendapat demikian karena mirip"[]"
yang terkenal menjadi tidak konteks."[]"
konteksnya, tetapi tidak dalam(quote [])
konteksnya. Apa yang "diperdebatkan" orang tidak di sini atau di sana.quote
dari sintaksis abstrak, tetapi mendukung sintaksis literal (tidak signifikan) dari kutipan. Dari apa yang saya lihat, kedua cara mengarah ke "Tidak" ke pertanyaan awal.