การแก้ไขเครื่องอ่านจะช่วยให้สามารถแนะนำไวยากรณ์การอ่านใหม่ (เช่น#(hash table)
และ'(quoted)
) Lisps หลายคนมีความสามารถนี้ แต่ดูเหมือนจะไม่มีสิ่งอำนวยความสะดวกสำหรับ elisp
การแก้ไขเครื่องอ่านจะช่วยให้สามารถแนะนำไวยากรณ์การอ่านใหม่ (เช่น#(hash table)
และ'(quoted)
) Lisps หลายคนมีความสามารถนี้ แต่ดูเหมือนจะไม่มีสิ่งอำนวยความสะดวกสำหรับ elisp
คำตอบ:
ปรากฎว่าคู่มือบอกเป็นนัยว่าคุณไม่สามารถใช้มาโครของเครื่องอ่าน
ตามภาคผนวก C การย้าย Lisp สามัญ :
มาโครผู้อ่าน Common Lisp รวมถึงแมโครชนิดที่สองที่ทำงานที่ระดับของอักขระแต่ละตัว ตัวอย่างเช่น Common Lisp ใช้เครื่องหมายคำพูดโดยแมโครของเครื่องอ่านที่เรียกว่า 'ในขณะที่ตัวแยกวิเคราะห์ของ Emacs Lisp เพียงใช้เครื่องหมายคำพูดเป็นกรณีพิเศษ แพ็คเกจ Lisp บางตัวใช้มาโครผู้อ่านเพื่อสร้างไวยากรณ์พิเศษสำหรับตัวเองซึ่ง Emacs parser ไม่สามารถอ่านได้
syntax.c
เช่นกัน ...
เห็นได้ชัดว่าสามารถทำได้ แต่เตรียมความพร้อมสำหรับการทำงานมาก (หรือไม่เพราะฉันจะจัดการมันบางสุดสัปดาห์ ;-)
(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))
ตอนนี้ "ทั้งหมด" ที่เหลืออยู่ที่ต้องทำคือการใช้ตัวอ่านเสียงกระเพื่อมที่สมบูรณ์ซึ่งสนับสนุนทุกสิ่งที่ Elisp ทำและสิ่งที่คุณต้องการมากขึ้น ฉันคิดว่านี่สามารถนำมาใช้เพื่อให้defpackage
สัญลักษณ์เหมือน CL และแพคเกจภายในเป็นตัวอย่างหนึ่ง นอกจากนี้ยังมีไวยากรณ์พิเศษสำหรับ regexps เป็นสิ่งที่ฉันไม่ต้องการทำ
แก้ไข: นี่เป็นการนำหลักฐานมาใช้ของแนวคิด: https://github.com/mishoo/elisp-reader.el