तो, मैं यह देखने की कोशिश कर रहा हूं कि किसी भी तर्क को स्वीकार करने वाले कार्य कैसे काम कर सकते हैं?योजना में वैकल्पिक तर्क और बिंदु
मैं इस
(define (plus x . xs)
(if
(null? xs) x
(plus (+ x (car xs)) . (cdr xs))))
(plus 1 2 3 4)
की कोशिश की लेकिन लग रहा था है कि यह वास्तव में XS को सीडीआर आवेदन नहीं किया गया था, लेकिन जब मैं डीबगर में यह माध्यम से कदम रखा में गुजर ((2 3 4))। इसलिए मैं करने की कोशिश की इस
(define (plus* x . xs)
(if
(null? xs) x
(let ((h (car xs))
(t (crd xs)))
(plus* (+ x h) . t))))
सोच: "हा, मैं तुम्हें अब में सीडीआर पारित देखना चाहते हैं", लेकिन मैं कोई त्रुटि मिलती है: में बुरा वाक्य रचना (`की 'अवैध उपयोग।):" आवेदन: (प्लस * (+ xh)। टी) "
क्या चल रहा है?
(मैं या तो द्वारा
(define (add . xs)
(foldl + 0 xs))
या यहां तक कि
(define (plus x . xs)
(if
(null? xs) x
(apply plus (cons (+ x (car xs)) (cdr xs)))))
हां, इसके अलावा समस्या, कैसे बिंदीदार चीजें काम है नहीं है, काम के अलावा के एक संस्करण प्राप्त कर सकते हैं।)
इसके बजाय यह क्या करता है? यदि कोई ऐसा नहीं है, तो डॉट का उपयोग कैसे करता है? –
'(x। Y)' को 'x' के साथ 'सी'' और' y' में अपने सीडीआर में एक कंस सेल के रूप में पढ़ा जाता है - यानी, यह उचित सूची नहीं है। इसी तरह, '(x। (Y))' 'x' के साथ 'कार' में एक विपक्षी सेल है, और सूची '(y)' 'cdr' में है - इसलिए यह' (xy) पढ़ने जैसा ही है '। तो जब आप '(प्लस एक्स। (सीडीआर टी)) लिखते हैं, तो यह वही है जैसा आपने लिखा था' (प्लस एक्स सीडीआर टी) ', जो आपके द्वारा प्राप्त भ्रमित परिणामों को बताता है। –
नोट बीटीडब्ल्यू कि रैकेट में एक वाक्यविन्यास प्रणाली है जो दोनों के बीच अंतर करना संभव बनाता है, और इस तरह के '' 'के साथ दर्ज की गई अभिव्यक्ति का इलाज करता है - लेकिन ऐसा नहीं किया जाता है क्योंकि इससे दूसरे में भी अधिक भ्रम पैदा हो सकता है स्थितियों। –