2015-11-06 8 views
6

मैं एल्म देख रहा हूं और मैं वास्तव में भाषा सीखने का आनंद लेता हूं। मैं एक स्प्रेडशीट एप्लिकेशन करने के बारे में सोच रहा हूं, लेकिन मैं अपने सिर को लपेट नहीं सकता कि इसे कैसे संरचित किया जाएगा।आप एल्म में स्प्रेडशीट ऐप कैसे बनाएंगे?

मान लें कि हमारे पास तीन कक्ष हैं; ए, बी और सी यदि मैं सेल बी में 4 सेल ए और =A में दर्ज करता हूं तो सेल सेल को हमेशा सेल ए के बराबर कैसे प्राप्त करूं? यदि मैं सेल सी में =A+B दर्ज करता हूं, तो इसका मूल्यांकन 8 पर किया जा सकता है, और जब ए या बी बदलता है तो भी अपडेट किया जा सकता है? इस तरह के गतिशील व्यवहार के लिए संकेतों को लीवर करने के लिए सुनिश्चित नहीं है .. सम्मान ओस्कर

उत्तर

5

सबसे पहले आपको यह तय करना होगा कि आपकी स्प्रेडशीट ग्रिड का प्रतिनिधित्व कैसे करें। यदि आप सी पृष्ठभूमि से आते हैं, तो आप 2 डी सरणी का उपयोग करना चाह सकते हैं, लेकिन मुझे पता चला है कि एक शब्दकोश वास्तव में एल्म में बेहतर काम करता है। तो आप type alias Grid a = Dict (Int, Int) a को परिभाषित कर सकते हैं।

a के लिए, प्रत्येक सेल क्या रखता है ... यह एक डोमेन-विशिष्ट भाषा को परिभाषित करने का अवसर है। तो

type Expr = Lit Float | Ref (Int, Int) | Op2 (Float -> Float -> Float) Expr Expr 

इसका मतलब है कि एक अभिव्यक्ति या तो एक शाब्दिक फ्लोट, किसी अन्य सेल स्थान का संदर्भ, या ऑपरेटर है। एक ऑपरेटर दो फ्लोट्स पर दो फ़ंक्शन और दो अन्य अभिव्यक्तियों का पुनरावृत्ति मूल्यांकन कर सकता है। आप जो भी जा रहे हैं उसके आधार पर, आप प्रत्येक ऑपरेशन के लिए विशिष्ट टैग को परिभाषित कर सकते हैं, जैसे कि Plus Expr Expr | Times Expr Expr, या आप अलग-अलग arity (जैसे नकारात्मक) के संचालन के लिए अतिरिक्त ओपन टैग जोड़ सकते हैं।

तो आप type alias Spreadsheet = Grid Expr को परिभाषित कर सकते हैं, और यदि आप (Int, Int) को कुछ करने के लिए उपनाम करना चाहते हैं, तो इससे भी मदद मिल सकती है। मैं यह भी मान रहा हूं कि आप केवल अपनी स्प्रेडशीट में तैरना चाहते हैं।

अब स्ट्रिंग्स को अभिव्यक्तियों में बदलने और वापस करने के लिए आपको फ़ंक्शंस की आवश्यकता है। इन कार्यों के लिए पारंपरिक नाम parse और eval हैं।

parse : String -> Maybe Expr -- Result can also work 
eval : Spreadsheet -> Grid Float 
evalOne : Expr -> Spreadsheet -> Maybe Float 

पार्स थोड़ा मुश्किल होगा; String module आपका मित्र है। इवल में स्प्रेडशीट के माध्यम से संदर्भों का पीछा करना और परिणामों को भरना शामिल होगा। सबसे पहले आप अनंत लूप को पकड़ने की संभावना को अनदेखा करना चाहते हैं। साथ ही, यह केवल एक स्केच है, यदि आपको लगता है कि विभिन्न प्रकार के हस्ताक्षर बेहतर काम करते हैं, तो उनका उपयोग करें।

दृश्य के रूप में, मैं केवल पढ़ने के साथ शुरू करूंगा, ताकि आप हार्ड-कोडित स्प्रैडशीट्स का सही ढंग से मूल्यांकन कर सकें। फिर आप संपादन के बारे में चिंता कर सकते हैं, इस विचार के साथ कि आप केवल पार्सर और मूल्यांकनकर्ता को दोबारा शुरू करते हैं और प्रस्तुत करने के लिए एक नई स्प्रेडशीट प्राप्त करते हैं। यह काम करना चाहिए क्योंकि एक स्प्रेडशीट में प्रत्येक सेल की सामग्री के अलावा कोई अन्य राज्य नहीं है। (पुनः संयोजित काम को कम करना आप इसे विस्तारित कर सकते हैं कई अलग-अलग तरीकों में से एक है।) यदि आप एल्म-एचटीएमएल का उपयोग कर रहे हैं, तो टेबल तत्वों को ठीक होना चाहिए।

आशा है कि यह आपको सही दिशा में बंद कर देगा। यह एक महत्वाकांक्षी परियोजना है और जब आप पूरा कर लेंगे तो मुझे इसे देखना अच्छा लगेगा (इसे mailing list पर पोस्ट करें)। सौभाग्य!

+0

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

संबंधित मुद्दे