मिस्टिकल
(suberic.net)- मिस्टिकल PostScript प्रोग्रामों को जादुई वृत्त जैसी आकृति में visualise करने का एक अनोखा तरीका है
- यह programming structure को रिंग (ring) के रूप में दर्शाता है, और इसमें executable array, non-executable array, dictionary जैसी कई types हैं
- sigil नाम के विशेष symbols के ज़रिए commands, variables, strings आदि को मौलिक ढंग से दिखाया जाता है
- definition patterns या function declarations के लिए अलग ligature अभिव्यक्ति लागू होती है, और user-custom sigils भी समर्थित हैं
- फिलहाल यह PostScript प्रोग्रामों को graphic images में बदलने वाला टूल है; इसका अपना interpreter मौजूद नहीं है
मिस्टिकल(Mystical) परिचय
मिस्टिकल एक प्रयोगात्मक प्रोजेक्ट है जिसका लक्ष्य जादुई वृत्त जैसा दिखने वाली programming language बनाना है। व्यवहार में यह PostScript code को जादुई वृत्त के रूप में visualise करने की एक विधि है, और इस दस्तावेज़ में इस विधि को 'मिस्टिकल' नाम दिया गया है।
रिंग (Rings) संरचना
- मिस्टिकल की संरचना का केंद्र रिंग का रूप है
- हर रिंग में अक्षर और sigils होते हैं, और इसकी अंदरूनी व बाहरी boundary lines होती हैं
- प्रोग्राम की मुख्य रिंग दाईं ओर (3 बजे की दिशा) से शुरू होकर घड़ी की उलटी दिशा (widdershins) में चलती है। यह PostScript के angle rules और इस विचार को दर्शाती है कि जादुई वृत्त बाहर से अंदर की ओर लिखे जाते हैं
- उप-रिंग अपने parent ring के संपर्क-बिंदु से शुरू होती हैं
रिंग के तीन प्रकार
- Executable array : PostScript के
{}के बराबर। अंदर और बाहर सरल वृत्ताकार boundary, star shape, और शुरुआत/समाप्ति पर alchemical symbols पर आधारित चिन्ह इस्तेमाल होते हैं - Non-executable array : PostScript के
[]के बराबर। इसमें star shape नहीं होती, और शुरुआत/समाप्ति के लिए triangle इस्तेमाल होते हैं - Dictionary : PostScript के
<<>>के बराबर। बहुभुजाकार रूप, दोहरी बाहरी boundary और एकल अंदरूनी boundary। शुरुआत/समाप्ति के संकेत समान हैं
जब किसी रिंग के भीतर दूसरी संरचना आती है, तो उसे छोटे बिंदु या रेखा से जोड़ा जाता है ताकि hierarchy को दृश्य रूप में दिखाया जा सके
PostScript उपयोग से जुड़ी सीमाएँ
- PostScript में
[ ]या<< >>को ऐसे तरीकों से इस्तेमाल किया जा सकता है जो मिस्टिकल के नियमों के अनुसार मान्य नहीं हैं, इसलिए उनकी सिफारिश नहीं की जाती gsave/grestore,begin/endआदि असंतुलित संरचनाओं में ज़्यादा उपयोग होते हैं, इसलिए इन्हें सामान्य sigils के रूप में संभाला जाता है
टेक्स्ट और sigils
- रिंग की किनारी पर अक्षर या sigils (विशेष symbols) रखे जाते हैं
- sigils operators, variables, keywords को दर्शाते हैं
- PostScript का
/nametriangle के भीतर name या sigil के रूप में, और string()scroll के आकार में दिखाई जाती है
Standard Sigils
- कई built-in operators के लिए अद्वितीय sigils मौजूद हैं
- इन्हें आम तौर पर command के initials, concept की छवि, या visual language के आधार पर design किया जाता है
उदाहरण: dup, copy, add, mul, neg, for, forall, repeat, if, ifelse, eq, ne, ge, gt, le, lt, moveto, lineto, arc, arcn, curveto, closepath, stroke, fill, gsave, grestore, translate, scale, rotate, setmatrix, currentmatrix, setrgbcolor, currentrgbcolor, setcmykcolor, currentcmykcolor, sethsbcolor, currenthsbcolor, setgray, currentgray, dict, begin, end, def, get, put, length आदि
User Sigils
- नई functions या names के लिए runtime में
sigil_bankमें जोड़ा जा सकता है - इन्हें 1-unit square के भीतर design करना होता है (coordinate transform संभव है)
nstrokeका उपयोग करने पर मौजूदा sigils जैसा ही typographic effect मिल सकता है- user variables के sigils अलग-अलग तरीकों से बनाए जा सकते हैं (अक्षरों की परतें, अलग visual languages आदि)
- आधिकारिक operators पर आधारित नए names को standard sigils के साथ जोड़ा जा सकता है
/name { ring } def ligature sigil
- function definition जैसे अक्सर उपयोग होने वाले patterns के लिए विशेष sigil दिया गया है
- name triangle के नीचे केवल connecting line दिखाई जाती है, और अलग
defsigil छोड़ दिया जाता है - यह तीनों रिंग types पर लागू हो सकता है
- अन्य
defउपयोग सामान्य sigil के रूप में दिखाए जाते हैं - यह केवल executable array के भीतर लागू होता है; dictionary के भीतर उपयोग में भ्रम की संभावना होने के कारण उपलब्ध नहीं है
sample algorithm
ऊपर की छवि Quicksort का उदाहरण है
Euclid के greatest common divisor (GCD) algorithm का उदाहरण भी दिया गया है। इस उदाहरण में user function /arg {exch def} def का उपयोग किया गया है
मिस्टिकल image generation functions
सभी "mystical.ps" में परिभाषित हैं
- mystical: array, executable array, या dictionary लेकर उसकी भीतरी संरचना तक recursively visualise करता है। पूरी image को unit circle के अनुसार scale किया जाता है
- mystical_evoke: कोई name लेकर current dictionary में उसे खोजता है और ऊपर की तरह render करता है
- mystical_evoke_label: name-def ligature sigil जोड़ता है, और दिशा इस तरह समायोजित करता है कि name sigil vertical दिखाई दे
इन functions के _unscaled versions भी मौजूद हैं। इस स्थिति में scale नहीं हो पाता, इसलिए रिंग बहुत बड़े आकार में output होती हैं
layout समस्याएँ
- मौजूदा code sub-circles की placement को टकराव से बचाते हुए optimize करता है, लेकिन यह काफ़ी conservative है, इसलिए layout ज़रूरत से ज़्यादा फैल जाता है
- उदाहरण चित्र में
mystical_get_spell,mystical_make_evocation_ligatureआदि से parsing/layout के बाद, draw_sigil, draw_link functions के ज़रिए चित्र को manually adjust करके output किया गया है - भविष्य में layout की default settings बेहतर की जाएँगी
programming language के रूप में मिस्टिकल
- फिलहाल मिस्टिकल PostScript प्रोग्रामों को draw करने वाला टूल है
- मिस्टिकल images को खुद interpret और execute करने वाला कोई interpreter नहीं है
- कोई व्यक्ति image देखकर PostScript code समझ सकता है, या उसे PostScript program के रूप में फिर से लिखकर चला सकता है
- भाषा-संबंधी चर्चा को आगे के लिए टाला गया है
दूसरी भाषाओं पर लागू होने की संभावना
- FORTH जैसी केवल operators पर आधारित भाषाओं में इसकी उपयोगिता काफ़ी हो सकती है
- अधिक जटिल संरचना वाली भाषाओं में इसे लागू करने पर रिंगों की संख्या अत्यधिक बढ़ सकती है
यह पृष्ठ 2025-05-16 को Denis द्वारा बनाया गया
1 टिप्पणियां
Hacker News की राय