إلى أي مدى يمكن أن يسب وحدات الماكرو تذهب ؟ [مغلقة]

StackOverflow https://stackoverflow.com/questions/1988

  •  08-06-2019
  •  | 
  •  

سؤال

لقد قرأت الكثير عن تلك اللثغة يمكن تعريف بناء الجملة على الطاير ، ويفترض مع وحدات الماكرو.أنا الغريب كيف يمتد هذا فعليا ؟ يمكنك إعادة تعريف بنية اللغة كثيرا أن الحد الفاصل يصبح مترجم عن لغة أخرى ؟ على سبيل المثال ، يمكنك تغيير طبيعة وظيفية من لثغة في أكثر وجوه المنحى في بناء الجملة ودلالات ربما يقول بعد جملة أقرب إلى شيء مثل روبي ؟

خصوصا انه من الممكن التخلص من قوسين الجحيم باستخدام وحدات الماكرو ؟ لقد تعلمت بما فيه الكفاية (Emacs-)اللثغة لتخصيص Emacs مع بلدي الصغرى الميزات, ولكن أنا غريبة جدا مدى وحدات الماكرو يمكن أن تذهب في تخصيص اللغة.

هل كانت مفيدة؟

المحلول

هذا سؤال جيد حقا.

أعتقد أنه من دقة ولكن بالتأكيد مسؤولة:

وحدات الماكرو ليست عالقة في s-التعبيرات.مشاهدة حلقة الكلي جدا معقدة لغة مكتوبة باستخدام الكلمات الرئيسية (الرموز).لذلك ، في حين قد بدء و نهاية الحلقة مع الأقواس داخل لديها بناء الجملة الخاص به.

على سبيل المثال:

(loop for x from 0 below 100
      when (even x)
      collect x)

أن يقال, أبسط وحدات الماكرو فقط استخدام s-التعبيرات.و ستكون "عالقة" في استخدامها.

ولكن s-تعبيرات مثل سيرجيو وقد أجاب تبدأ في الشعور الصحيح.جملة خرجت من الطريق والبدء في الترميز في شجرة جملة.

أما بالنسبة القارئ وحدات الماكرو ، نعم ، هل يمكن تصور أكتب شيئا من هذا القبيل:

#R{
      ruby.code.goes.here
  }

ولكن كنت بحاجة إلى الكتابة الخاصة بك روبي جملة محلل.

يمكنك أيضا تقليد بعض روبي يبني مثل كتل ، مع وحدات الماكرو التي تجمع القائمة اللثغة بنيات.

#B(some lisp (code goes here))

من شأنها أن تترجم إلى

(lambda () (some lisp (code goes here)))

انظر هذه الصفحة عن كيفية القيام بذلك.

نصائح أخرى

نعم ، يمكنك إعادة تعريف بناء الجملة بحيث يسب يصبح مترجم.يمكنك القيام بذلك باستخدام "القارئ وحدات الماكرو" والتي تختلف عن العادي "مترجم وحدات الماكرو" أن من المحتمل أنك تفكر.

Common Lisp لديه المدمج في مرفق لتحديد جملة جديدة للقارئ و قارئ وحدات الماكرو إلى عملية بناء الجملة.تتم معالجة هذا على قراءة من الوقت (الذي يأتي قبل تجميع أو eval الوقت).لمعرفة المزيد عن تعريف القارئ وحدات الماكرو في Common Lisp ، انظر Common Lisp Hyperspec -- سوف تحتاج إلى قراءة Ch.2, "الجملة" و Ch.23 "القارئ".(أعتقد مخطط له نفس المرفق ، ولكن أنا لم تكن مألوفة مع ذلك-أرى مخطط مصادر عن قوس لغة البرمجة).

كمثال بسيط, لنفترض أنك تريد اللثغة إلى استخدام الأقواس المتعرجة بدلا من الأقواس.هذا يتطلب شيئا من هذا القبيل ما يلي القارئ التعاريف:

;; { and } become list delimiters, along with ( and ).
(set-syntax-from-char #\{ #\( )
(defun lcurly-brace-reader (stream inchar) ; this was way too easy to do.
  (declare (ignore inchar))
  (read-delimited-list #\} stream t))
(set-macro-character #\{ #'lcurly-brace-reader)

(set-macro-character #\} (get-macro-character #\) ))
(set-syntax-from-char #\} #\) )

;; un-lisp -- make parens meaningless
(set-syntax-from-char #\) #\] ) ; ( and ) become normal braces
(set-syntax-from-char #\( #\[ )

أنت تقول اللثغة أن { مثل ( وأن } هو مثل ).ثم يمكنك إنشاء دالة (lcurly-brace-reader) أن القارئ سوف أتصل كلما يرى {و استخدام set-macro-character إسناد هذه المهمة إلى {.ثم تقول اللثغة أن ( و ) مثل [ و ] (وهذا هو ، وليس معنى الجملة).

الأشياء الأخرى التي يمكن أن تشمل ، على سبيل المثال ، إنشاء سلسلة جديدة بناء الجملة أو باستخدام [ و ] أن أرفق في إصلاح تدوين هذا في S-التعبيرات.

يمكنك أيضا الذهاب إلى أبعد من هذا ، إعادة تعريف كامل بناء الجملة الخاصة بك ماكرو الشخصيات التي سوف تؤدي الإجراءات في القارئ ، حتى السماء حقا هو الحد.هذا هو مجرد واحدة من الأسباب لماذا غراهام بول و الآخرين تقول هذا Lisp هي لغة جيدة في كتابة المترجم.

أنا لا يسب خبير هيك أنا حتى لا يسب مبرمج, ولكن بعد قليل من تجريب اللغة جئت إلى استنتاج مفاده أن بعد حين قوسين بدء تصبح 'غير مرئية' و يمكنك البدء في رؤية الكود كما تريد لها أن تكون.يمكنك البدء في دفع المزيد من الاهتمام النحوية يبني إنشاء طريق s-exprs و وحدات الماكرو أقل المعجمية شكل نص قوائم قوسين.

هذا هو خصيصا صحيح إذا كنت الاستفادة من محرر جيد أن يساعد مع المسافة البادئة و التلوين اللغوي (محاولة وضع قوسين إلى اللون مشابهة جدا الخلفية).

أنك قد لا تكون قادرة على استبدال اللغة تماما 'روبي' الجملة, ولكن كنت لا تحتاج إليها.بفضل اللغة المرونة يمكن أن ينتهي وجود اللهجة التي يشعر مثل أنت بعد 'روبي أسلوب البرمجة' إذا كنت تريد ، أيا كان ذلك يعني لك.

أعرف أن هذا هو مجرد الملاحظة التجريبية ، ولكن أعتقد أنه كان واحدا من تلك اللثغة التنوير لحظات عندما أدركت هذا.

مرارا وتكرارا, القادمين الجدد إلى اللثغة تريد "التخلص من جميع قوسين." يستمر لبضعة أسابيع.أي مشروع لبناء خطيرة الغرض العام البرمجة الجملة على أعلى من المعتاد S-التعبير اللغوي من أي وقت مضى يحصل في أي مكان ، لأن المبرمجين دائما الرياح مفضلا ما كنت حاليا تعتبره "بين قوسين الجحيم". فإنه يأخذ القليل من التعود ، ولكن ليس كثيرا!مرة واحدة يمكنك أن تعتاد على ذلك ، يمكن أن نقدر حقا اللدونة الافتراضي الجملة ، تعود إلى اللغات حيث لا يوجد سوى طريقة واحدة للتعبير عن أي برمجة معينة بناء هو حقا [غرتينغ].

أن يقال, Lisp ممتازة الركيزة لبناء المجال لغات معينة.مجرد جيدة كما ، إن لم تكن أفضل من XML.

حظا سعيدا!

أفضل شرح اللثغة وحدات الماكرو رأيته في

https://www.youtube.com/watch?v=4NO83wZVT0A

بدءا من حوالي 55 دقيقة.هذا هو شريط فيديو من محاضرة قدمها بيتر سيبل ، مؤلف "العملية Common Lisp" ، الذي هو أفضل اللثغة الكتب هناك.

الدافع اللثغة وحدات الماكرو هي عادة من الصعب أن أشرح ، لأنها فعلا حيز الخاصة بها في الحالات التي تكون طويلة جدا موجودة في البرنامج التعليمي بسيطة.بيتر يأتي مع مجموعة كبيرة من الأمثلة على ذلك ؛ يمكنك فهم ذلك تماما ، ويجعل جيدة, الاستخدام السليم اللثغة وحدات الماكرو.

لقد طلبت:"هل يمكنك تغيير طبيعة وظيفية من لثغة في أكثر وجوه المنحى في بناء الجملة ودلالات".الجواب هو نعم.في الواقع ، اللثغة في الأصل لم يكن لديك أي وجوه المنحى البرمجة في كل شيء ، ليس من المستغرب منذ اللثغة كانت موجودة منذ قبل وجوه المنحى البرمجة!ولكن عندما علمت عن OOP في عام 1978 ، كنا قادرين على إضافة إلى اللثغة بسهولة, باستخدام, من بين أمور أخرى, وحدات الماكرو.في نهاية المطاف Common Lisp وجوه النظام (كلوس) وضعت قوية جدا وجوه المنحى البرمجة النظام الذي يناسب بأناقة في اللثغة.كل شيء يمكن تحميل امتدادا -- لا شيء بنيت في!انها كل ذلك مع وحدات الماكرو.

اللثغة لديها مختلفة تماما ميزة تسمى "القارئ وحدات الماكرو", التي يمكن استخدامها لتوسيع سطح بناء الجملة من اللغة.باستخدام قارئ وحدات الماكرو يمكنك جعل sublanguages أن يكون ج-مثل أو روبي-مثل بناء الجملة.تحويل النص إلى اللثغة ، داخليا.هذه لا تستخدم على نطاق واسع من قبل معظم الحقيقي اللثغة المبرمجين ، وذلك أساسا لأنه من الصعب تمديد تطوير بيئة تفاعلية لفهم جملة جديدة.على سبيل المثال, Emacs المسافة البادئة الأوامر سيكون في حيرة من جديد في بناء الجملة.إذا كنت حيوية ، على الرغم من إيماكس هو للمد أيضا, و هل يمكن تعليم عن الجديد المعجمية الجملة.

العادية وحدات الماكرو تعمل على قوائم الكائنات.الأكثر شيوعا من هذه الكائنات القوائم الأخرى (وبالتالي تشكيل الأشجار) والرموز ، ولكن يمكن أن تكون الكائنات الأخرى مثل السلاسل ، hashtables, المعرفة من قبل المستخدم الكائنات ، وما إلى ذلك.هذه الهياكل هي تسمى s-exps.

لذا, عند تحميل الملف المصدر الخاص بك اللثغة المترجم تحليل النص و إنتاج s-exps.تعمل وحدات الماكرو هذه.هذا يعمل كبيرة و رائعة طريقة لتمديد اللغة داخل روح s-exps.

بالإضافة إلى ذلك آنفا عملية تحليل يمكن تمديدها من خلال "القارئ وحدات الماكرو" التي تمكنك من تخصيص طريقة مترجم يتحول النص إلى s-exps.لكنني أرى أنك تبني اللثغة جملة بدلا من الانحناء إلى شيء آخر.

تبدو مشوشة قليلا عند ذكر اللثغة في "طبيعة وظيفية" و روبي "وجوه المنحى اللغوي".لست متأكدا ما "وجوه المنحى جملة" ومن المفترض أن تكون, ولكن اللثغة هو متعدد نموذج لغة تدعم البرمجة الشيئية extremelly حسنا.

راجع للشغل, عندما أقول اللثغة ، أعني Common Lisp.

أقترح عليك وضع التحيزات الخاصة بك بعيدا ، تعطي اللثغة صادق الذهاب.

بين قوسين الجحيم ؟ أنا لا أرى أكثر قوسين في:

(function toto)

من:

function(toto);

و في

(if tata (toto)
  (titi)
  (tutu))

لا يزيد في:

if (tata)
  toto();
else
{
  titi();
  tutu();
}

أرى أقل قوسين ';' على الرغم من.

ما كنت تسأل ما هو كمن يسأل كيف تصبح خبير الشوكولاته بحيث يمكنك إزالة كل ما الجهنمية البني من الاشياء المفضلة لديك كعكة الشوكولاته.

نعم ، يمكنك تغيير جذري في بناء الجملة ، وحتى الهروب "الأقواس الجحيم".والتي سوف تحتاج إلى تحديد قارئ جديد بناء الجملة.أنظر إلى القارئ وحدات الماكرو.

أنا لا تشك إلا أنه للوصول إلى مستوى من يسب الخبرة البرنامج مثل وحدات الماكرو سوف تحتاج إلى تزج نفسك في اللغة إلى حد أنه لم يعد النظر في parenthese "الجحيم".أولا-هاء.بحلول الوقت الذي كنت تعرف كيفية تجنب لهم ، عليك أن يقبل منهم شيء جيد.

إذا كنت تريد اللثغة أن تبدو مثل روبي استخدام روبي.

أنه من الممكن استخدام روبي (الثعبان) في اللثغة مثل الطريقة التي هي واحدة من الأسباب الرئيسية التي اكتسبت القبول بسرعة.

انظر هذا المثال كيفية القارئ وحدات الماكرو يمكن أن تمتد اللثغة القارئ مع المهام المعقدة مثل XML النموذجيه:

http://common-lisp.net/project/cl-quasi-quote/present-class.html

هذا مكتبة المستخدم يجمع ثابت أجزاء XML إلى UTF-8 ترميز الحرفي بايت المصفوفات في وقت الترجمة التي هي على استعداد أن أكتب تسلسل كنت في تيار الشبكة.وهي قابلة للاستخدام في الحالات العادية اللثغة وحدات الماكرو ، فهي متعامد...وضع فاصلة حرف التأثيرات أجزاء ثابتة و التي ينبغي تقييمها في وقت التشغيل.

المزيد من التفاصيل متوفرة في: http://common-lisp.net/project/cl-quasi-quote/

مشروع آخر من أجل Common Lisp تركيب ملحقات: http://common-lisp.net/project/cl-syntax-sugar/

@sparkes

في بعض الأحيان LISP هي لغة واضحة الاختيار ، وهي Emacs امتداد.أنا متأكد من أني يمكن استخدام روبي تمديد Emacs إذا أردت ، ولكن Emacs تم تمديدها مع اللثغة ، لذا يبدو من المنطقي أن استخدامه في هذه الحالة.

انها مسألة صعبة.منذ لثغة بالفعل هيكليا قريبة جدا إلى تحليل شجرة الفرق بين عدد كبير من وحدات الماكرو وتنفيذ الخاصة بك مصغرة اللغة في محلل مولد ليست واضحة جدا.ولكن باستثناء فتح وإغلاق paren ، يمكن بسهولة جدا في نهاية المطاف مع شيء التي تبدو شيء مثل lisp.

واحدة من استخدامات وحدات الماكرو التي فجرت عقلي كان في وقت التحويل البرمجي التحقق من طلبات SQL ضد ديسيبل.

مرة واحدة كنت أدرك أن لديك كامل اللغة في متناول اليد في وقت التحويل البرمجي ، فإنه يفتح آفاقا جديدة مثيرة للاهتمام.وهو ما يعني أيضا يمكنك تصوير نفسك في القدم بطرق جديدة مثيرة للاهتمام (مثل تقديم تجميع لا استنساخه ، والتي يمكن بسهولة جدا تتحول إلى التصحيح كابوس).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top