हाल ही में मुझे एक हास्केल कार्यक्रम लिखने का आनंद मिला जो यह पता लगा सकता था कि क्या NegativeLiterals
विस्तार में लगे हुए हैं। मैं निम्नलिखित के साथ आया:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$1==u(-1)
यह True
सामान्य रूप से और False
अन्यथा मुद्रित होगा ।
अब मुझे ऐसा करने में बहुत मज़ा आ रहा था, मैं आप सभी को चुनौती दे रहा हूँ। आप किस अन्य हास्केल भाषा एक्सटेंशन को क्रैक कर सकते हैं?
नियम
किसी विशेष भाषा एक्सटेंशन को क्रैक करने के लिए आपको एक हास्केल प्रोग्राम लिखना होगा जो भाषा एक्सटेंशन के साथ और उसके बिना दोनों को संकलित करता है (चेतावनियां ठीक हैं) और भाषा एक्सटेंशन के साथ चलने पर दो अलग - अलग गैर-त्रुटि मानों को आउटपुट करता है और यह बंद हो गया ( No
उपसर्ग जोड़कर) भाषा का विस्तार)। इस तरह ऊपर दिए गए कोड को छोटा किया जा सकता है:
data B=B{u::Integer}
instance Num B where{fromInteger=B;negate _=B 1}
main=print$u(-1)
जो प्रिंट करता है 1
और -1
।
किसी एक्सटेंशन को क्रैक करने के लिए आपके द्वारा उपयोग की जाने वाली कोई भी विधि उस एक्सटेंशन के लिए विशिष्ट होनी चाहिए। मनमाने ढंग से पता लगाने के तरीके हो सकते हैं कि संकलक झंडे या LanguageExtensions सक्षम हैं, यदि ऐसा है तो ऐसे तरीकों की अनुमति नहीं है। आप अतिरिक्त भाषा एक्सटेंशन सक्षम कर सकते हैं या -O
अपने बाइट काउंट के लिए बिना किसी लागत के कंपाइलर ऑप्टिमाइज़ेशन को बदल सकते हैं।
भाषा एक्सटेंशन
आपको लगता है कि एक नहीं है किसी भी भाषा विस्तार दरार नहीं कर सकते No
समकक्ष (जैसे Haskell98
, Haskell2010
, Unsafe
, Trustworthy
, Safe
) क्योंकि इन शब्दों के ऊपर उल्लिखित के अंतर्गत नहीं आता। हर दूसरे भाषा का विस्तार निष्पक्ष खेल है।
स्कोरिंग
आपको हर भाषा एक्सटेंशन के लिए एक बिंदु से सम्मानित किया जाएगा, जिसे आप क्रैक करने वाले पहले व्यक्ति हैं और हर भाषा एक्सटेंशन के लिए एक अतिरिक्त बिंदु जिसके लिए आपके पास सबसे छोटा (बाइट्स में मापा गया) दरार है। दूसरे बिंदुओं के लिए संबंध पहले के सबमिशन के पक्ष में टूट जाएंगे। उच्च अंक बेहतर है
आप पहले प्रस्तुत करने के लिए एक बिंदु स्कोर नहीं कर पाएंगे NegativeLiterals
या QuasiQuotes
क्योंकि मैंने पहले ही उन्हें क्रैक कर दिया है और उन्हें पोस्ट के शरीर में शामिल किया है। हालाँकि आप इनमें से प्रत्येक की सबसे छोटी दरार के लिए एक बिंदु बना पाएंगे। यहाँ मेरी दरार हैQuasiQuotes
import Text.Heredoc
main=print[here|here<-""] -- |]
NondecreasingIndentation
स्पष्ट कारण शामिल नहीं हैं
Wait, what language extension is this?
या कुछ पूरी तरह से अलग है।
RelaxedPolyRec
एक कंपाइलर प्राचीन के लिए वास्तव में इसे बंद करने का समर्थन करता है। (विकल्प के आसपास लटका दिया गया, प्रलेखन के साथ, कुछ वर्षों के बाद कुछ भी करना बंद कर दिया।)