एस-अभिव्यक्ति पठनीयता


9

संक्षेप में और उन लोगों के लिए जो इसे नहीं जानते थे, लिस्प फ़ंक्शंस / ऑपरेटर्स / कंस्ट्रक्शन सभी को समान रूप से बुलाया जाता है:

(function arg0 arg1 ... argN)

तो सी-जैसी भाषा में आप क्या व्यक्त करेंगे

if (a > b && foo(param))

एक लिस्प सेक्सपार्ट में बदल जाता है

(if (and (> a b) (foo param)))

। चूंकि चीजें अधिक वास्तविक / जटिल होती हैं, इसलिए उनके अनुरूप एस-एक्सप्रेशन, मेरे लिए करें।

मुझे पता है कि यह सबसे अधिक संभावना है कि एक व्यक्तिपरक सवाल है, लेकिन - कई लिस्प हैकर्स के लिए यह एक छोटी सी झुंझलाहट है जो हमेशा से निपटना होगा?

या एक को ज्यादातर सिंटैक्स की कमी (कमी) होती है या बाद में?

किसी भी मामले में, पठनीयता जोड़ रहा है (जो कि आप अपने सी समतुल्य, अधिकांश समय में नहीं जोड़ेंगे) पठनीयता के लिए एक अच्छा विचार, विशेष रूप से लंबे समय तक? किसी अन्य सुझाव का स्वागत किया जाएगा।


1
क्या आपने लिस्प के साथ लिस्प-जागरूक वातावरण में लिस्प का उपयोग करने की कोशिश की है? मैं इसे किसी भी अन्य तरीके से नहीं छूता।
डेविड थॉर्नले

नहीं, मैंने अपने लिस्प अनुभव को बेहतर नहीं बनाया है?
vemv

छोटे कार्य लिखना भी बहुत महत्वपूर्ण है, हालांकि मैंने केवल क्लोजर के साथ कुछ खेल किया है।
केविन

3
एक अच्छे लिस्प वातावरण में, आप कोष्ठक की उपेक्षा करते हैं और इंडेंटेशन द्वारा संरचना को पढ़ते हैं। जैसा कि आपने देखा है, कोष्ठक की गणना करके संरचना को पढ़ना वास्तव में वास्तव में कष्टप्रद है।
डेविड थॉर्नले

जवाबों:


8

आप कैसे पार्स करते हैं?

if (a > b && foo(param)) {
  doSomething();
} else {
  doSomethingElse();
}

तोता पेड़ शायद कुछ ऐसा दिखता है

if:
  condition:
    and:
      lt:
        left: a
        right: b
      function:
        name: foo
        param: param
  true-block:
    function:
      name: doSomething
  false-block:
    function:
      name: doSomethingElse

हम्म ... चलो इस पेड़ को एक सूची, उपसर्ग संकेतन में क्रमबद्ध करें

if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))

इस पार्स ट्री प्रारूप में हेरफेर करना बहुत आसान है, लेकिन मुझे एक समस्या है। मुझे विभाजकों से नफरत है। मुझे टर्मिनेटर पसंद हैं। उसी समय, मुझे व्हॉट्सएप में छिड़कना पसंद है।

if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))

हम्म ... अतिरिक्त व्हाट्सएप कुछ चीजों को पार्स करने के लिए कठिन बनाता है ... शायद मैं सिर्फ एक नियम बना सकता हूं कि पेड़ को मूल पत्ती के पत्ते के रूप में दर्शाया गया है।

(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)

अब एक पार्स पेड़ की मेरी क्रमबद्धता है तुतलाना (नाम बदलने लागू करने के लिए समारोह, और यह शायद चलता है)। अगर मुझे ऐसे प्रोग्राम चाहिए जो प्रोग्राम लिखते हैं, तो सिर्फ पार्स ट्री में हेरफेर करना अच्छा है।

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

लेकिन जैसा कि डेविड ने कहा, एक एस-एक्सप्रेशन जागरूक संपादक का उपयोग करें। आपको xml में बंद ब्रेस की तुलना में एस-एक्सप्रेशन में क्लोजिंग ब्रेस का ट्रैक खोने की अधिक संभावना है ( </foo>केवल बंद हो जाता है <foo>, लेकिन दायां पैरन किसी भी एस-एक्सप्रेशन को बंद कर देता है)। रैकेट में, कुछ भावों के लिए वर्ग कोष्ठक का उपयोग, अच्छी इंडेंटिंग शैली के साथ मिलकर, अधिकांश समस्याओं को ठीक करता है।

लिस्प संस्करण:

(if (and (< a b) (foo param))
  (doSomething)
  (doSomethingElse))

इतना भी बेकार नहीं।


एक्सपोज़ + कथनों में कोई संदेह नहीं है की तुलना में सूचियाँ अधिक बहुमुखी और शक्तिशाली हैं। Emacs (या और क्या?) की कोशिश कर रहा है, लेकिन नवीनतम समय मैं कोशिश की यह सिर्फ मुझे बहुत डरा दिया। सेक्स जागरूकता क्या वास्तव में लाता है?
वीएमसी

सरल सामान: वे एक प्रकाश को करीब और खुले परेंस पर उछालते हैं (या पूरे एस-भावों को अलग तरह से उजागर करते हैं)। उनके पास अच्छे इंडेंटिंग नियम हैं। Emacs में अन्य चीजें हैं, लेकिन वे पठनीयता के लिए संभवतः उतने महत्वपूर्ण नहीं हैं। अन्य एस-अभिव्यक्ति जागरूक संपादक हैं। आप emacs की जरूरत नहीं है अगर emacs आपको डराता है, तो textmate, उदात्त, आदि के लिए बंडलों का प्रयास करें। एक बार जब आपका संपादक पठनीयता के साथ मदद करना शुरू कर देता है, तो चीजें थोड़ी आसान हो जाती हैं। मैं रैकेट में अधिकांश लिस्फी सामान करता हूं, जो चौकोर कोष्ठकों को कहीं भी अनुमति देता है जिसका उपयोग किया जा सकता है। स्विच करने में सक्षम होने से पठनीयता में मदद मिलती है।
ccoakley 22

1
एक तरफ के रूप में, नेस्टेड देता है, परिभाषित करता है, आदि का उपयोग करें कि सामान को छोटे टुकड़ों में तोड़ दें। यदि आप एक अच्छे नाम के साथ नहीं आ सकते हैं, तो अपने डिजाइन के बारे में एक चेतावनी के रूप में व्यवहार करें। बहुत छोटे-से-नाम और बहुत बड़े-से-पढ़ने के बीच संतुलन का पता लगाएं।
22

ओह, यह आखिरी सलाह है ... यादगार :) जैसा कि मैं यह लिख रहा हूँ उदात्त कोशिश कर रहा हूँ।
vemv

5

एस-एक्स के बारे में वास्तव में अच्छा है कि थोड़े समय के बाद, आप उन्हें अब और नहीं देखते हैं, यह आपकी आंखों के लिए अजगर की तरह है लेकिन कंप्यूटर अभी भी आसानी से पेड़ है।

  • तो इंडेंटेशन स्वचालित है, कोई अस्पष्टता नहीं है, आपको टैब को दो बार या उस तरह से दबाने की ज़रूरत नहीं है जब आप एक ब्लॉक को समाप्त करना चाहते हैं।

  • यदि आप कुछ यादृच्छिक कोड चुनते हैं, तो पूरे सामान को आसानी से अपने पसंदीदा संपादक से सिर्फ एक कमांड के साथ इंडेंट किया जाता है

  • आप अपने कोड के माध्यम से वास्तव में आसानी से नेविगेट कर सकते हैं, एस-एक्स के बीच कूद सकते हैं, उन्हें स्वैप कर सकते हैं और एक अच्छे संपादक के साथ

साथ ही, क्योंकि आप जिस डेटा में हेरफेर कर रहे हैं, वह वही है जो कोड आप लिख रहे हैं, आप उसी भाषा का उपयोग अपने कोड में हेरफेर करने के लिए कर सकते हैं?

ठीक है, आप यह कर सकते हैं, कि मैक्रोज़ क्या हैं, आप किसी अन्य सूची की तरह मूल्यांकन करने से पहले आपके द्वारा लिखे गए कोड में हेरफेर करते हैं, इसीलिए यह कहा जाता है कि लिस्प एक "प्रोग्रामेबल प्रोग्रामिंग लैंग्वेज" है। आप कोड लिखें जो आपके लिए अपना कोड लिखें।

यहाँ एक अच्छा लेख है जो लिस्प की प्रकृति का वर्णन करता है और लिस्प प्रोग्रामर्स ने एक्सएमएल को देखते हुए क्यों मुस्कुराया।

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