मैं Elisp के रीडर को कैसे संशोधित कर सकता हूं?


12

पाठक को संशोधित करने से नए रीड-सिंटैक्स (जैसे कि #(hash table)और '(quoted)) शुरू करने की अनुमति होगी । कई लिस्प्स में यह क्षमता होती है, लेकिन ऐसी कोई सुविधा मौजूद नहीं है।


C स्रोतों को हैक करें।
वामासा

3
Emacs लिस्प में एक लिस्प-प्रोग्रामेबल रीडर नहीं है।
आकर्षित किया

@wasamasa खैर, यह हमेशा एक विकल्प है :) एक पोर्टेबल नहीं , बल्कि एक विकल्प।
सीन एलेड

मुझे लगता है कि "कई लिसप्स के पास यह है।" एक वास्तविक प्रश्न नहीं है। मैं एक असली सवाल करना पसंद करूंगा। मैं शीर्षक को छोटा करने का सुझाव देता हूं, और इसे शरीर में फिर से लागू करता हूं।
यंगफ्रॉग

@YoungFrog संपादन का स्वागत करता है। मैं अत्यधिक सीधा होने के बिना कुछ भी अधिक प्रत्यक्ष या उचित नहीं सोच सकता था। प्रश्न सरल है; यह लंबा होना जरूरी नहीं है।
सीन एलेड

जवाबों:


11

पता चला है कि मैनुअल का मतलब है कि आप वास्तव में रीडर मैक्रोज़ नहीं कर सकते।

परिशिष्ट C पोर्टिंग कॉमन लिस्प के अनुसार :

पाठक मैक्रों। आम लिस्प में एक दूसरे प्रकार का मैक्रो शामिल है जो व्यक्तिगत पात्रों के स्तर पर काम करता है। उदाहरण के लिए, कॉमन लिस्प एक पाठक मैक्रो नामक उद्धरण संकेतन को लागू करता है, जबकि Emacs Lisp का पार्सर सिर्फ उद्धरण को एक विशेष मामले के रूप में मानता है। कुछ लिस्प पैकेज अपने लिए विशेष वाक्यविन्यास बनाने के लिए रीडर मैक्रोज़ का उपयोग करते हैं, जो एमएसीएस पार्सर पढ़ने में असमर्थ है।


मुझे लगता है कि यह कॉमन लिस्प सॉफ्टवेयर के बारे में है जो एलिस्प के बजाय विशेष रीडर मैक्रोज़ का उपयोग करते हैं। यह पृष्ठ सीएल कोड को एलिस्प में पोर्ट करने के बारे में है। और हाँ, आधिकारिक तौर पर पाठक अनुकूलन नहीं है, लेकिन नीचे मेरा जवाब देखें ...
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))

अब "सभी" जो करना बाकी है, वह एक पूर्ण लिस्प पाठक को लागू करना है जो एलिसा करता है और जो आप अधिक चाहते हैं वह सब कुछ का समर्थन करता है। मुझे लगता है कि यह defpackageएक उदाहरण के रूप में सीएल-जैसे और पैकेज आंतरिक प्रतीकों को प्रदान करने के लिए इस्तेमाल किया जा सकता है । इसके अलावा, regexps के लिए एक विशेष वाक्यविन्यास कुछ ऐसा है जो मैं बुरी तरह से करना चाहता हूं (या अधिक सटीक रूप से, कुछ स्ट्रिंग सिंटैक्स जो बैकस्लैश की व्याख्या नहीं करता है)।

संपादित करें: यहाँ एक प्रूफ-ऑफ-कॉन्सेप्ट कार्यान्वयन है: https://github.com/mishoo/elisp-reader.el


संभवतः जब तक आप वास्तव में एक पूर्ण लिस्प रीडर लागू नहीं कर देते, जब तक कि आपने सुझाव नहीं दिया हो, तब तक इसे उत्तर के रूप में पोस्ट न करें (जो, मैं अनुमान लगा रहा हूं, एक तुच्छ उद्यम नहीं है)।
दान

@ यह उल्लेखनीय है, यह सिर्फ इतना है कि सी में ऐसा करना बहुत अधिक दर्दनाक है क्योंकि यह स्ट्रिंग प्रसंस्करण के लिए बेकार है।
वामासा

1
@ यह काम कर रहा है, मैंने कार्यान्वयन के लिए लिंक जोड़ने का उत्तर संपादित किया।
मिशू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.