मुझे नहीं पता कि यह सुझाव "अच्छा" की परिष्कृत परिभाषाओं के लिए "अच्छा" है, लेकिन यह आसान और मजेदार है। मैं अक्सर प्रदान करता हूं जो प्रतिपादन कोड के साथ जोड़ने, Haskell में एक पाठ संपादक के मूल लिखने के लिए एक अभ्यास सेट। डेटा मॉडल निम्नानुसार है।
सबसे पहले, मैं परिभाषित करता हूं कि x
-elements की सूची में कर्सर होने के लिए यह क्या है, जहां कर्सर पर उपलब्ध जानकारी कुछ प्रकार m
है। (x
बाहर हो जाएगा Char
या String
किया जाना है।)
type Cursor x m = (Bwd x, m, [x])
यह Bwd
बात सिर्फ पिछड़े "snoc-सूची" है। मैं मजबूत स्थानिक अंतर्ज्ञान रखना चाहता हूं, इसलिए मैं अपने कोड में चीजों को बदलता हूं, न कि मेरे सिर में। विचार यह है कि कर्सर के नजदीक सामान सबसे आसानी से सुलभ है। यही जिपर की भावना है।
data Bwd x = B0 | Bwd x :< x deriving (Show, Eq)
मैं एक नि: शुल्क सिंगलटन प्रकार कर्सर के लिए एक पठनीय मार्कर के रूप में कार्य करने के लिए प्रदान करते हैं ...
data Here = Here deriving Show
... और मुझे इस प्रकार कह सकते हैं कि यह एक String
में कहीं हो रहा है
type StringCursor = Cursor Char Here
अब, कई लाइनों की एक बफर प्रतिनिधित्व करने के लिए, हम String
रों ऊपर और कर्सर के साथ रेखा से नीचे की जरूरत है, और बीच में एक StringCursor
, लाइन के लिए हम वर्तमान में संपादन कर रहे हैं।
type TextCursor = Cursor String StringCursor
यह TextCursor
प्रकार सब मैं संपादन बफ़र की स्थिति को दर्शाने के लिए है। यह एक दो परत जिपर है। मैं छात्रों को एएनएसआई-एस्केप-सक्षम शेल विंडो में टेक्स्ट पर व्यूपोर्ट प्रस्तुत करने के लिए कोड प्रदान करता हूं, यह सुनिश्चित करता है कि व्यूपोर्ट में कर्सर हो। उन्हें बस इतना करना है कि कुंजीस्ट्रोक के जवाब में TextCursor
अपडेट करने वाले कोड को लागू करें।
handleKey :: Key -> TextCursor -> Maybe (Damage, TextCursor)
जहां handleKey
Nothing
लौटना चाहिए अगर कीस्ट्रोक व्यर्थ है, लेकिन अन्यथा Just
देने एक अद्यतन TextCursor
और एक "क्षति रिपोर्ट",
data Damage
= NoChange -- use this if nothing at all happened
| PointChanged -- use this if you moved the cursor but kept the text
| LineChanged -- use this if you changed text only on the current line
| LotsChanged -- use this if you changed text off the current line
deriving (Show, Eq, Ord)
के उत्तरार्द्ध से एक होने (आप सोच रहे हैं कि Nothing
लौटने और Just (NoChange, ...)
लौटने के बीच क्या अंतर है, इस पर विचार करें कि क्या आप संपादक को बीप जाने के लिए भी चाहते हैं।) क्षति रिपोर्ट प्रस्तुतकर्ता को बताती है कि प्रदर्शित छवि को अद्यतित करने के लिए कितना काम करना है।
Key
प्रकार केवल कच्चे एएनएसआई एस्केप दृश्यों से दूर सारणित संभावित कीस्ट्रोक को एक पठनीय डेटाटाइप प्रतिनिधित्व देता है। यह अपरिहार्य है।
मैं किट के इन हिस्सों को देकर इस डेटा मॉडल के साथ के बारे में ऊपर जाने के लिए एक बड़ा सुराग और नीचे तक छात्रों प्रदान करते हैं:
deactivate :: Cursor x Here -> (Int, [x])
deactivate c = outward 0 c where
outward i (B0, Here, xs) = (i, xs)
outward i (xz :< x, Here, xs) = outward (i + 1) (xz, Here, x : xs)
deactivate
समारोह एक Cursor
से बाहर फोकस शिफ्ट करने के लिए, दे रही है प्रयोग किया जाता है आप एक सामान्य सूची है, लेकिन आपको बता रहे हैं कि कर्सर था। इसी activate
समारोह एक सूची में दी गई स्थिति पर कर्सर रखने के लिए प्रयास करता है:
activate :: (Int, [x]) -> Cursor x Here
activate (i, xs) = inward i (B0, Here, xs) where
inward _ c@(_, Here, []) = c -- we can go no further
inward 0 c = c -- we should go no further
inward i (xz, Here, x : xs) = inward (i - 1) (xz :< x, Here, xs) -- and on!
मैं छात्रों की पेशकश handleKey
handleKey :: Key -> TextCursor -> Maybe (Damage, TextCursor)
handleKey (CharKey c) (sz,
(cz, Here, cs),
ss)
= Just (LineChanged, (sz,
(cz, Here, c : cs),
ss))
handleKey _ _ = Nothing
की जान-बूझकर गलत और अधूरी परिभाषा जो सिर्फ साधारण चरित्र कीस्ट्रोक्स लेकिन संभालती है पाठ पीछे की तरफ आता है। यह देखना आसान है कि c
के पर दिखाई देता है। मैं उन्हें बग को ठीक करने और तीर कुंजी, बैकस्पेस, डिलीट, रिटर्न इत्यादि के लिए कार्यक्षमता जोड़ने के लिए आमंत्रित करता हूं।
यह अब तक का सबसे कुशल प्रतिनिधित्व नहीं हो सकता है, लेकिन यह पूरी तरह से कार्यात्मक है और कोड को संपादित किए जा रहे पाठ के बारे में हमारे स्थानिक अंतर्ज्ञानों को ठोस रूप से अनुरूप बनाने में सक्षम बनाता है।
आप .. ज़िपर पर गौर कर सकते – Satvik
आप जीयूआई ढांचे का उपयोग कर रहे हैं (जब तक आप एक सांत्वना आधारित एप्लिकेशन की योजना बना रहे) संभाल हो सकता है द्वारा विवश किया जा सकता है टिन से सीधे आपके लिए सभी पाठ संपादन। – AndrewC
सूची जिपर देखो। –