योजना का सरल परिधि

Nov 09 2020

वर्तमान में मैं एक पाठ्यक्रम के हिस्से के रूप में योजना सीख रहा हूं। जिस तरह से यह मुझे सिखाया गया है वह स्पष्ट अभिव्यक्ति के उदार उपयोग के साथ है, और मेरे द्वारा दिए गए परीक्षण के अधिकांश उदाहरण वर्णित के रूप में काम नहीं करते हैं। जितना अधिक मैं पढ़ता हूं, यह स्पष्ट हो जाता है कि मुझे eval का उपयोग इतनी आसानी से नहीं करना चाहिए। मैंने javaScript में कुछ परिधि विधियों को देखा है, लेकिन मैं स्कीम के लिए कुछ विशिष्ट की तलाश कर रहा हूं।

जब यह आवश्यक हो तो यह लिंक कुछ जानकारी प्रदान करता है। यह वास्तव में मुझे एक अच्छी परिधि विधि का पता लगाने में मदद नहीं करता है।

इस लिंक में अधिक अच्छी जानकारी है, लेकिन मेरी स्थिति से बचने का कोई तरीका नहीं है।

यह लिंक मेरे सवाल का जवाब देने के करीब आया, और मुझे यह समझने में मदद की कि eval अपेक्षित रूप से काम क्यों नहीं करता है, लेकिन मैं अभी भी स्पष्ट नहीं हूं कि eval अभिव्यक्ति के लिए एक अच्छा प्रतिस्थापन क्या होगा।

मैं जो देख रहा हूँ वह यह करने का मानक तरीका है:

(define (add a_list)
    (cond
        ((null? a_list) 0)
        (eval(cons '+ a_list)))
)

(add '(3 4 8 12 30))

बिना निष्कासन के, ताकि वह 57 लौटे । वर्तमान में यह रिटर्न (+ 3 4 8 12 30) । इस लिंक से ऐसा प्रतीत होता है कि कहते हैं, (+ 3 4) स्वचालित रूप से 7 का मूल्यांकन करेगा, लेकिन मुझे कोई मूल्यांकन के साथ अभिव्यक्ति के रूप में मेरे पास वापस मुद्रित सूची मिल रही है।

यह निम्नलिखित तरीकों से लिखा हुआ काम करेगा:

(define (add a_list)
    (cond
        ((null? a_list) 0)
        (eval(eval(cons '+ a_list))))
)

(add '(3 4 8 12 30))

रिटर्न 57 लेकिन में से एक evals कुछ नहीं कर रहा है। तथा :

(define (add a_list)
  (eval(cons '+ a_list))
)

(add '(3 4 8 12 30))

57 लौटाता है लेकिन एक खाली सूची की जाँच नहीं करता है।

किसी भी तरह से इसे पूरी तरह से हटाने में मदद (या केवल यदि आवश्यक हो तो इसका उपयोग करना) बहुत सराहना की जाएगी।

अग्रिम में धन्यवाद!

जवाब

1 ÓscarLópez Nov 09 2020 at 01:28

उल्लेख किए गए उदाहरणों के लिए, आपको ज़रूरत नहीं है eval, एक सरल applyकाम करेगा। और आपका संदेह सही है, हमें evalज्यादातर समय का उपयोग करने से बचना चाहिए - इसे "बुराई" माना जाता है।

(define (add a_list)
  (apply + a_list))