क्लासिक किताब The Little Lisper (The Little Schemer) दो बड़े विचारोंज़िप्पर और एचओएफ की वजह से एक गंध (मुहावरेदार क्लोजर में) रिकर्सन है?
पर आधारित है- आप (यह मानते हुए आप पूंछ कॉल अनुकूलन है)
- लिस्प महान है (बजाय छोरों का उपयोग कर के) एक पुनरावर्ती रास्ते में सबसे समस्याओं को हल कर सकते हैं क्योंकि यह अपने आप में लागू करना आसान है।
अब कोई सोच सकता है कि यह सभी लिस्पी भाषाओं (क्लोजर समेत) के लिए सच है। मुसीबत यह है कि पुस्तक अपने समय (1 9 8 9) का एक आर्टेफैक्ट है, संभवतः Functional ProgrammingHigher Order Functions (एचओएफ) के साथ हमारे पास आज है। (या कम से कम स्नातक के लिए आकर्षक माना जाता था)।
रिकर्सन (कम से कम भाग में) का लाभ ('a 'b ('c ('d 'e)))
जैसे नेस्टेड डेटा संरचनाओं के ट्रैवर्सल की आसानी है।
example के लिए:
(def leftmost
(fn [l]
(println "(leftmost " l)
(println (non-atom? l))
(cond
(null? l) '()
(non-atom? (first l)) (leftmost (first l))
true (first l))))
अब Functional Zippers साथ - हम नेस्ट डेटा संरचनाओं traversing करने के लिए एक गैर पुनरावर्ती दृष्टिकोण है, और उन्हें हम करेंगे किसी भी आलसी डेटा संरचना के रूप में पार कर सकते हैं। example के लिए:
(defn map-zipper [m]
(zip/zipper
(fn [x] (or (map? x) (map? (nth x 1))))
(fn [x] (seq (if (map? x) x (nth x 1))))
(fn [x children]
(if (map? x)
(into {} children)
(assoc x 1 (into {} children))))
m))
(def m {:a 3 :b {:x true :y false} :c 4})
(-> (map-zipper m) zip/down zip/right zip/node)
;;=> [:b {:y false, :x true}]
अब यह आप के साथ किसी भी नेस्टेड सूची ट्रेवर्सल समस्या को हल कर सकते हैं लगता है या तो:
- एक
zipper
ऊपर के रूप में, या - एक
zipper
कि संरचना चलता है और का एक सेट देता है कुंजी जो आपकोassoc
का उपयोग करके संरचना को संशोधित करने देगी।
अनुमान:
- मैं पाठ्यक्रम डेटा संरचनाओं की यह सोचते हैं रहा है कि निश्चित-आकार, और पूरी तरह से पूर्व में जाना जाता Traversal को
- मैं स्ट्रीमिंग का डेटा स्रोत परिदृश्य को छोड़कर कर रहा हूँ।
मेरा प्रश्न है: ज़िप्पर और एचओएफ की वजह से एक गंध (मुहावरेदार क्लोजर में) रिकर्सन है?
यह एक गंध हो सकता है, लेकिन हाथों में विशेष समस्याओं के लिए अप्रिय नहीं है। उदाहरण के लिए, कुछ संरचित और निर्धारिती उत्पन्न करने के लिए असंगठित (या संदिग्ध) इनपुट को संसाधित करना। –
क्या आप एक उत्तर दे सकते हैं और एक उदाहरण प्रदान कर सकते हैं? ऐसा लगता है कि नॉर्विग के आर्टिफिशियल इंटेलिजेंस प्रोग्रामिंग – hawkeye