ฉันจะแก้ไขตัวอ่านของ Elisp ได้อย่างไร


12

การแก้ไขเครื่องอ่านจะช่วยให้สามารถแนะนำไวยากรณ์การอ่านใหม่ (เช่น#(hash table)และ'(quoted)) Lisps หลายคนมีความสามารถนี้ แต่ดูเหมือนจะไม่มีสิ่งอำนวยความสะดวกสำหรับ elisp


แฮ็คแหล่งข้อมูล C
wasamasa

3
Emacs Lisp ไม่มีโปรแกรมอ่าน Lisp ที่ตั้งค่าได้
Drew

@wasamasa ดีนั่นคือตัวเลือกเสมอ :) ไม่ใช่เครื่องพกพาแต่เป็นตัวเลือก
ฌอน Allred

ฉันคิดว่า "Lisps จำนวนมากมีสิ่งนี้" ไม่ใช่คำถามจริง ฉันอยากจะมีคำถามจริง ๆ ฉันขอแนะนำให้ย่อหัวเรื่องและใช้ถ้อยคำใหม่ในร่างกาย
YoungFrog

@YoungFrog ยินดีต้อนรับการแก้ไข ฉันไม่สามารถคิดอะไรที่ตรงหรือเหมาะสมกว่านี้ได้โดยไม่ต้องพูดมากเกินไป คำถามนั้นง่าย มันไม่จำเป็นต้องยาว
ฌอน Allred

คำตอบ:


11

ปรากฎว่าคู่มือบอกเป็นนัยว่าคุณไม่สามารถใช้มาโครของเครื่องอ่าน

ตามภาคผนวก C การย้าย Lisp สามัญ :

มาโครผู้อ่าน Common Lisp รวมถึงแมโครชนิดที่สองที่ทำงานที่ระดับของอักขระแต่ละตัว ตัวอย่างเช่น Common Lisp ใช้เครื่องหมายคำพูดโดยแมโครของเครื่องอ่านที่เรียกว่า 'ในขณะที่ตัวแยกวิเคราะห์ของ Emacs Lisp เพียงใช้เครื่องหมายคำพูดเป็นกรณีพิเศษ แพ็คเกจ Lisp บางตัวใช้มาโครผู้อ่านเพื่อสร้างไวยากรณ์พิเศษสำหรับตัวเองซึ่ง Emacs parser ไม่สามารถอ่านได้


ฉันคิดว่านี่เป็นเรื่องเกี่ยวกับซอฟต์แวร์ Common LISP ที่ใช้มาโครอ่านพิเศษแทน Elisp หน้านี้เกี่ยวกับการย้ายรหัส CL ไปยัง Elisp และใช่อย่างเป็นทางการอ่านไม่ได้ปรับแต่ง แต่เห็นคำตอบของฉันด้านล่าง ...
mishoo

ปัญหาอื่นที่นี่คือแม้ว่าคุณจะได้แนะนำไวยากรณ์ผู้อ่านใหม่ส่วนที่เหลือของ Emacs ไม่ได้ตระหนักถึงมันดังนั้นคุณจะต้องแก้ไขsyntax.cเช่นกัน ...
wasamasa

9

เห็นได้ชัดว่าสามารถทำได้ แต่เตรียมความพร้อมสำหรับการทำงานมาก (หรือไม่เพราะฉันจะจัดการมันบางสุดสัปดาห์ ;-)

(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


อาจดีที่สุดที่จะไม่โพสต์สิ่งนี้เป็นคำตอบจนกระทั่งหลังจากที่คุณได้ใช้งานเครื่องอ่าน Lisp แบบสมบูรณ์ตามที่คุณแนะนำ
Dan

@ แดนมันเป็นไปได้มันแค่การทำมันใน C นั้นเจ็บปวดมากกว่านี้มากเพราะมันแย่สำหรับการประมวลผลสตริง
wasamasa

1
@Dan มันทำงานได้ฉันแก้ไขคำตอบเพื่อเพิ่มลิงค์ไปยังการใช้งาน
mishoo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.