Bagaimana saya bisa memodifikasi pembaca Elisp?

12

Memodifikasi pembaca akan memungkinkan pengenalan sintaks baca baru (seperti #(hash table)dan '(quoted)). Banyak Lisps memiliki kemampuan ini, tetapi tampaknya tidak ada fasilitas seperti itu untuk elisp.

Sean Allred
sumber
Meretas sumber C.
wasamasa
3
Emacs Lisp tidak memiliki pembaca Lisp yang dapat diprogram.
Drew
@wasamasa Yah, itu selalu menjadi pilihan :) Bukan yang portabel , tapi pilihan.
Sean Allred
Saya pikir "Banyak Lisps punya ini." bukan pertanyaan aktual. Saya lebih suka memiliki pertanyaan nyata. Saya sarankan untuk mempersingkat judul, dan ulangi kata itu ke dalam tubuh.
YoungFrog
Selamat datang di suntinganYoungFrog. Saya tidak bisa memikirkan sesuatu yang lebih langsung atau sesuai tanpa terlalu bertele-tele. Pertanyaannya sederhana; tidak harus lama.
Sean Allred

Jawaban:

11

Ternyata manual itu menyiratkan bahwa Anda tidak bisa benar-benar melakukan makro pembaca.

Menurut Lampiran C Porting Common Lisp :

Makro pembaca Common Lisp termasuk tipe makro kedua yang bekerja pada level karakter individu. Sebagai contoh, Common Lisp mengimplementasikan notasi kutipan oleh pembaca makro yang disebut ', sedangkan parser Emacs Lisp hanya memperlakukan kutipan sebagai kasus khusus. Beberapa paket Lisp menggunakan makro pembaca untuk membuat sintaksis khusus untuk mereka sendiri, yang tidak dapat dibaca oleh pengurai Emacs.

Dan
sumber
Saya pikir ini tentang perangkat lunak Common Lisp yang menggunakan makro pembaca khusus, bukan Elisp. Halaman ini berisi tentang porting kode CL ke Elisp. Dan ya, secara resmi pembaca tidak dapat dikustomisasi, tetapi lihat jawaban saya di bawah ini ...
mishoo
Masalah lain di sini adalah bahkan jika Anda entah bagaimana memperkenalkan sintaks pembaca baru, sisa Emacs tidak menyadarinya, jadi Anda juga harus memperbaikinya syntax.c...
wasamasa
9

Tampaknya itu bisa dilakukan, tetapi bersiaplah untuk banyak pekerjaan. (atau tidak, karena aku akan mengatasinya akhir pekan ;-).

(defvar *orig-read* (symbol-function 'read))

(defun read (&optional in)
  (message "reading from %s" load-file-name)
  (funcall *orig-read* in))

(setq load-read-function (symbol-function 'read))

Sekarang "semua" yang tersisa untuk dilakukan adalah mengimplementasikan Lisp reader lengkap yang mendukung semua yang Elisp lakukan dan apa pun yang Anda inginkan. Saya pikir ini dapat digunakan untuk memberikan defpackagesimbol internal seperti-CL dan paket, sebagai salah satu contoh. Juga, sintaks khusus untuk regexps adalah sesuatu yang sangat ingin saya lakukan (atau lebih tepatnya, beberapa sintaks string yang tidak menginterpretasikan garis miring terbalik).

Sunting: inilah implementasi konsep bukti: https://github.com/mishoo/elisp-reader.el

mishoo
sumber
Mungkin lebih baik untuk tidak memposting ini sebagai jawaban sampai setelah Anda benar-benar menerapkan pembaca Lisp lengkap seperti yang Anda sarankan (yang, saya kira, bukan perusahaan sepele).
Dan
@Dan Bisa dilakukan, hanya saja melakukannya di C jauh lebih menyakitkan karena menyebalkan untuk pemrosesan string.
wasamasa
1
@Dan berhasil, saya mengedit jawaban untuk menambahkan tautan ke implementasi.
mishoo