Apakah kesetaraan kontekstual dari suatu bahasa dengan `quote`-`eval` sepele atau tidak?

13

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:αevalquote

Saya pertama kali berpikir bahwa dalam bahasa dengan fitur quote- evalseperti LISP [3] tidak ada perbedaan jenis antara objek sintaksis dan yang dapat dieksekusi. Bahkan quote- evaltampaknya cukup aman di LISP karena, meskipun secara quotesintaksis terlihat seperti operator bona fi de, seperti katakan cond, itu benar-benar tidak berperilaku seperti satu (itu hanya memiliki perilaku pada waktu parse, tidak menjalankan waktu, misalnya, seseorang tidak dapat lulus quotesebagai parameter untuk suatu prosedur). Namun, saya belum melihat contoh meyakinkan di mana quote- evalfitur itu berharga.

Terlepas dari satu kelemahan kecil dalam komentar ini yang dapat menyesatkan pembaca untuk menyimpulkan bahwa conddapat diteruskan sebagai parameter untuk suatu prosedur. Jika saya mengerti dengan benar, apa yang Meyer katakan " quote- evaltampaknya cukup aman" berarti bahwa quote- evalmungkin 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.

hari
sumber
1
Saya akan menyarankan untuk mempertimbangkan jika Anda dapat membuat pertanyaan lebih spesifik: ada berbagai cara untuk mengimplementasikan eval / quote seperti konstruk, dan berbagai opsi dalam merancang persamaan kontekstual untuk kalkuli tersebut. Publikasi terkait baru-baru ini yang menarik adalah Reasoning About Multi-Stage Programs oleh Inoue, Taha.
Martin Berger
1
Perbedaan utama adalah antara CTMP (compile-time meta-programming, seperti yang dicontohkan oleh Template Haskell, Lisp / Scheme / Racket dan Converge , dan RTMP (run-time meta-programming seperti eval Javascript, atau MetaOCaml). Parameter lainnya adalah mengetik . Berikut adalah pembicaraan gambaran saya berikan beberapa bulan kembali tentang hal ini, cukup dangkal aku takut mengenai ekivalensi kontekstual, sedikit kerja telah dilakukan, sebagian besar memiliki ke negara cairan pemrograman dukungan untuk meta-programming..
Martin Berger
1
@ plmday: BTW, bahasa pemrograman ideal Wand resmi dalam The Theory of Fexprs Is Trivial sangat berbeda dari Lisp, meta-programming. Yang pertama adalah RTMP, yang terakhir (tergantung pada implementasi konkret) tidak.
Martin Berger
1
@ MartinBerger: Bisakah Anda memposting pembicaraan Anda sebagai pdf?
Dave Clarke
1
@ Dave Clarke, yakin, di sini itu! Umpan balik.
Martin Berger

Jawaban:

2

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.

Sam Tobin-Hochstadt
sumber
Saya pikir ada satu cara untuk mengecualikan (quote []), daripada angan-angan, sebagai konteks: menolak gagasan memperlakukan 'datumsebagai gula sintaksis untuk (quote datum), kemudian '[], karena "[]"tidak lagi konteks. Macro skema telah mengaburkan quote.
hari
Saya tidak mengerti komentar Anda, @hari. Mengapa hubungan antara 'datumdan (quote datum)mengubah apa pun?
Sam Tobin-Hochstadt
Jika quotebahasa dikonstruksi dan 'datumdiinginkan (quote datum), orang akan cenderung berpendapat bahwa itu (quote [])adalah konteks. Jika kita menghapus quotedari bahasa inti, tetapi mendukung literal 'datumsintaks, maka mereka akan cenderung berpendapat demikian karena mirip "[]"yang terkenal menjadi tidak konteks.
hari
@ Hari, ini salah paham. Tidak ada definisi yang benar tentang "konteks". Hanya saja konteks yang berbeda mendukung gagasan berbeda tentang kesetaraan kontekstual. Misalnya, spasi putih secara semantik signifikan dalam "[]"konteksnya, tetapi tidak dalam (quote [])konteksnya. Apa yang "diperdebatkan" orang tidak di sini atau di sana.
Sam Tobin-Hochstadt
Saya setuju bahwa tidak ada definisi konteks yang benar. Tetapi ada satu definisi tradisional berdasarkan sintaksis abstrak, yang digunakan Wand dalam makalahnya dan Meyer gunakan dalam artikelnya, untuk mempertanyakan status kesetaraan kontekstual Lisp. Apa yang Anda sarankan adalah mengganti definisi konteks tradisional dengan konteks evaluasi. Apa yang saya sarankan adalah menjaga definisi konteks tradisional, menghilangkan quotedari sintaksis abstrak, tetapi mendukung sintaksis literal (tidak signifikan) dari kutipan. Dari apa yang saya lihat, kedua cara mengarah ke "Tidak" ke pertanyaan awal.
hari