لماذا من المعتاد وضع العديد من الأقواس الختامية على سطر واحد باللغات القائمة على LISP؟

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

سؤال

عادة ما يبدو الرمز هكذا:

(one-thing
    (another-thing arg1 (f arg5 r))
    (another-thing arg1 (f arg5 r)))

لماذا لا مثل هذا؟:

(one-thing
    (another-thing arg1 (f arg5 r))
    (another-thing arg1 (f arg5 r))
)

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

ما مدى سوء ذلك عندما أخلط بواسطة رمز يستخدم النمط الثاني مع التعليمات البرمجية الموجودة التي تستخدم النمط الأول؟

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

المحلول

هناك نقطتان يجب تقديمهما هنا:

  1. الاتفاقيات مهمة في حد ذاتها. التمسك بـ Parens ملفوفة يعني أن الرمز الخاص بك أكثر قابلية للقراءة من قبل مبرمجي LISP الآخرين ، وإذا كنت تبني هذا النمط ، فستقوم أيضًا بتطوير الممارسة في قراءة نظيرهم

  2. مزايا الانقسام )S على خطوطهم الخاصة ليست في الواقع مزايا في عيون معظم lispers. إذا كنت تستخدم محررًا نصف خلاص ، فسيكون لديه أوامر تفهم التعبيرات المتوازنة ، للانتقال عبرها ، والقطع ، واللصق ، والنقل ، وما إلى ذلك. حتى لا تحتاج

    )  ; end of the loop
    

    في Lisp أكثر مما تحتاج

    # end of the loop
    

    في لغة حساسة للمسافة البيضاء مثل Python

انظر على سبيل المثال http://www.gnu.org/software/emacs/manual/html_node/emacs/expressions.html

نصائح أخرى

في LISP واللغات الأخرى التي تستخدم التعبير S للناء على بناء الجملة ، تكون الأقواس في المقام الأول لصالح المترجم ، في حين أن التخطيط والمسافة البادئة (التي يتم تجاهلها من قبل المترجم) هي لصالح المبرمجين.

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

فمثلا،

(defun clone-indirect-buffer-other-window (newname display-flag &optional norecord)
  "Like `clone-indirect-buffer' but display in another window."
  (interactive
   (progn
     (if (get major-mode 'no-clone-indirect)
         (error "Cannot indirectly clone a buffer in %s mode" mode-name))
     (list (if current-prefix-arg
               (read-buffer "Name of indirect buffer: " (current-buffer)))
           t)))
  (let ((pop-up-windows t))
    (clone-indirect-buffer newname display-flag norecord)))

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

(defun clone-indirect-buffer-other-window (newname display-flag &optional norecord)
  "Like `clone-indirect-buffer' but display in another window."
  (interactive
   (progn
     (if (get major-mode 'no-clone-indirect)
         (error "Cannot indirectly clone a buffer in %s mode" mode-name)
       )
     (list (if current-prefix-arg
               (read-buffer "Name of indirect buffer: " (current-buffer))
             )
           t)
     )
   )
  (let ((pop-up-windows t))
    (clone-indirect-buffer newname display-flag norecord)
    )
  )

أود أن أضيف أن جميع مبرمجي LISP تقريبًا يستخدمون محررًا يعرض قوسين مطابقة ، ويقوم بإجراء المسافة البادئة التلقائية ، ويوفر واجهة مستخدم للعمل بشكل دوري مع تعبيرات متوازنة. في emacs ، على سبيل المثال ، هناك m- (m- ( لإدخال تعبير جديد ، م) لتتخطى نهاية التعبير الحالي ، CMK لحذف التعبير بعد نقطة ، وهلم جرا.

لذلك لا يتعين على مبرمجي LISP عد الأقواس باليد من أجل معرفة أي منها يتطابق.


تايلور ر. كامبل يعبر ببلاغة عن هذا الأساس المنطقي:

أحرف الأقواس الفعلية هي ببساطة رموز معجمية لا ينبغي تعيين أهمية ضئيلة. لا يفحص مبرمجي LISP بين الأقواس بشكل فردي ، أو ، لا سمح Azathoth ، عدد الأقواس ؛ بدلاً من ذلك ، ينظرون إلى الهياكل ذات المستوى الأعلى المعبر عنها في البرنامج ، خاصةً كما قدمها المسافة البادئة. Lisp لا يتعلق بكتابة سلسلة من التعليمات التسلسلية ؛ إنه يتعلق ببناء الهياكل المعقدة عن طريق جمع الأجزاء. تكوين الهياكل المعقدة من الأجزاء هو محور برامج LISP ، ويجب أن يكون واضحًا بسهولة من رمز LISP. إن وضع الأقواس بشكل عشوائي حول العرض التقديمي يتجول في مبرمج LISP ، الذي لم يراها في معظمها.

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

اجابة طويلة: http://blog.fogus.me/2010/08/30/community-standards/

افعل ما يعجبك! إنه الكود الخاص بك.

ومع ذلك ، من المحتمل أن تنقلهم جميعًا في النهاية حتى تتمكن من الحصول على المزيد من الأشياء على الشاشة مرة واحدة. صحيح حقًا أنك تتوقف بشكل فعال عن رؤية الأقواس بعد فترة.

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

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

إذا كنت تستخدم emacs ، فأنت بحاجة إلى ليتعلم هؤلاء. خاصه، C-M-k يجعل قتل تعبير متوازن بنفس القدر مثل قتل الخط. زوجين ذلك مع تسليط الضوء على قوسين متوازنين ، وليس هناك حاجة حقًا لكتابة الأشياء بهذه الطريقة.

من ناحية أخرى ، وجود كل هؤلاء )يعني S على خطوط أنفسهم أنك ترى أقل من التعليمات البرمجية الخاصة بك على الشاشة في وقت واحد ، مما يجعل من الصعب القراءة وإعادة التجديد.

إذا كنت لا تستخدم EMACs ، فيجب عليك على الأقل استخدام محرر يدعم تلك العمليات الأساسية ، أو سيكون الترميز في LISP ألمًا.

من المهم حفظ الشاشة الرأسية (والعين).

أعتقد أن إجابة جيدة على ذلك هي طرح سؤال ذي صلة:

لماذا لا يضع مبرمجي Python الحروف الرسومية التي تغلق التعشيش على خطوطهم الخاصة؟

والإجابة الآن واضحة: لا توجد مثل هذه الحروف الرسومية. واتضح ذلك لا توجد مثل هذه الحروف الرسومية في lisp أيضًا: نعم ، هناك هذه مزعجة بشكل معتدل ( و ) الشخصيات التي يحتاجها قارئ LISP ، لكن البشر لا يقرؤون كود LISP مثل هذا: يقرأونه عن طريق المسافة البادئة والكلمات.

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

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