कभी भी आपको मध्यवर्ती प्रतिनिधित्व की आवश्यकता होती है जिसका उपयोग कोड उत्पन्न करने के लिए किया जाएगा, मेरे दिमाग में सबसे स्पष्ट चीज एक सार वाक्यविन्यास पेड़ (एएसटी) है। आपका उदाहरण प्रतिनिधित्व सूचियां है, जो मेरे अनुभव में एक रूप के रूप में लचीला नहीं है। छोटी सी चीज पीढ़ी से ज्यादा किसी चीज के लिए, मैं झाड़ी के चारों ओर नहीं मारूंगा, और बस एक पूर्ण उड़ा हुआ एएसटी प्रतिनिधित्व के साथ जाऊंगा। सूचियों का उपयोग करके, आप पीढ़ी के पक्ष में अधिक प्रकार के काम को पुश करने के लिए और जैसे पहले आइटम का अर्थ विश्लेषण करते हैं। एएसटी प्रतिनिधित्व में जाने से आपको अधिक लचीलापन मिल जाएगा और पार्सिंग साइड से अधिक काम की लागत (या फॉर्म उत्पन्न करने वाले कार्यों से अधिक काम) की लागत पर, सिस्टम के अधिक से अधिक decouples। पीढ़ी की ओर से और भी काम कर रहे हैं, लेकिन उन घटकों में से कई को डीकॉप्लेड किया जा सकता है क्योंकि उनके इनपुट अधिक संरचित होंगे।
क्या एएसटी देखो की तरह, मैं या तो क्रिस्टोफ़ ग्रांड के लू ए, नकल हैं चाहिए जहां वह {:tag <tag name> :attrs <map of attrs> :content <some collection>}
का उपयोग करता है या क्या clojure स्क्रिप्ट का उपयोग करता है, {:op <some operator> :children <some collection>}
के संदर्भ में।
यह जब से तुम मनमाना वॉकर कि :children
में झांक सकते हैं परिभाषित कर सकते हैं और क्या :op
की या :tag
के बारे में वास्तव में जानने के बिना किसी भी संरचना पार कर सकते हैं यह काफी सामान्य बनाता है।
फिर परमाणु घटकों के लिए, आप इसे मानचित्र में लपेट सकते हैं और इसे कुछ प्रकार की जानकारी (अपने डीएसएल के अर्थशास्त्र के संबंध में) दे सकते हैं जो वस्तु के वास्तविक प्रकार से स्वतंत्र है। {:atom <the object> :type :background-image}
।
कोड जनरेशन पक्ष पर, जब परमाणु का सामना करना पड़ता है, तो आपका कोड :type
पर प्रेषित कर सकता है, और फिर, यदि आप चाहते हैं, तो ऑब्जेक्ट के वास्तविक प्रकार पर आगे प्रेषण करें। संग्रह रूपों से जनरेशन भी आसान है, प्रेषण: op /: टैग, और फिर बच्चों के साथ दोबारा शुरू करें। बच्चों के लिए किस संग्रह का उपयोग करना है, मैं Google समूहों पर चर्चा पर और अधिक पढ़ूंगा। उनके निष्कर्ष मेरे लिए प्रबुद्ध थे।
https://groups.google.com/forum/#!topic/clojure-dev/vZLVKmKX0oc/discussion
इस तरह के एक अगर बयान में के रूप में बच्चों के लिए संक्षेप में, है, अगर वहाँ अर्थ आदेश महत्व थे, तो एक नक्शा {:conditional z :then y :else x}
का उपयोग करें। अगर यह सिर्फ एक तर्क सूची थी, तो आप एक वेक्टर का उपयोग कर सकते हैं।
बहुत धन्यवाद - बस अंतर्दृष्टि की तरह मैं ढूंढ रहा था! – mikera