Mystical
(suberic.net)- Mystical คือรูปแบบการเขียนสัญลักษณ์ที่วาดโปรแกรม PostScript เป็นโครงสร้างวงกลมคล้ายวงเวท และแม้เอกสารจะ扱いเหมือนภาษา แต่ในทางปฏิบัติใกล้เคียงกับการแทน PostScript ในเชิงภาพมากกว่า
- โครงสร้างหลักคือ ring โดยแยก execution array
{}, non-execution array[]และ dictionary<< >>ด้วยขอบ ดาว สามเหลี่ยม และรูปหลายเหลี่ยม - ข้อความและ sigil บริเวณขอบ ring จะแปลง operator, variable, keyword, string และ name ของ PostScript ให้เป็นสัญลักษณ์หรือรูปแบบตกแต่ง
mystical.psเรนเดอร์ array, execution array และ dictionary เป็นภาพ Mystical ส่วนmystify.pyจะห่อโปรแกรม PostScript ให้เป็นภาพ Mystical กว้าง 8 นิ้วบนหน้า 8.5x11 และแปลงคอมเมนต์ด้วย- ปัจจุบัน ยังไม่มี interpreter ที่อ่านภาพ Mystical แล้วคำนวณได้ มีเพียงระดับที่มนุษย์สามารถแปลงภาพกลับเป็น PostScript แล้วรันได้
รูปแบบการวาด PostScript ให้เหมือนวงเวท
- Mystical เริ่มจากเป้าหมายที่อยากสร้างภาษาโปรแกรมมิงที่ดูคล้ายวงเวท
- ในความเป็นจริง ใกล้เคียงกับวิธีเขียนหรือวาด PostScript ให้ดูเหมือนวงเวทมากกว่า
- มีเอกสารการติดตั้งและเริ่มต้นใช้งานแยกต่างหาก
โครงสร้างแบบ ring
- โปรแกรม Mystical ประกอบด้วย ring
- ring คือแถบวงกลมที่มีขอบด้านในและด้านนอก โดยวางข้อความและ sigil ไว้ภายใน
- เนื้อหาของ ring หลักเริ่มจากด้านขวาสุดหรือ ตำแหน่ง 3 นาฬิกา แล้วไหลทวนเข็มนาฬิกา
- เป็นไปตามระบบมุมของ PostScript และสะท้อนสมมติฐานว่าเขียน ring จากด้านนอก
- ring ย่อยเริ่มจากจุดที่เชื่อมกับโครงสร้างที่เรียกมัน
-
ring สามประเภท
- execution array ตรงกับ
{ }ของ PostScript มีขอบวงกลมเรียบง่ายทั้งด้านในและด้านนอก และมีรูปดาวอยู่ภายใน - จุดเริ่มต้นและสิ้นสุดของ execution array จะแสดงด้วยสัญลักษณ์ที่มาจากสัญลักษณ์ “งานเสร็จสิ้น” ในวิชาเล่นแร่แปรธาตุ
- non-execution array ตรงกับ
[ ]ของ PostScript คล้าย execution array แต่ไม่มีรูปดาว - จุดเริ่มต้นและสิ้นสุดของ non-execution array แสดงด้วยสามเหลี่ยมเรียบง่าย
- dictionary ตรงกับ
<< >>ของ PostScript แสดงเป็น รูปหลายเหลี่ยม ที่มีขอบนอกสองชั้นและขอบในชั้นเดียว - เครื่องหมายจุดเริ่มต้นและสิ้นสุดของ dictionary เหมือนกับ array
- ลำดับรายการในภาพ dictionary อาจต่างจากข้อความ PostScript
- เพราะใน PostScript จะไม่รักษาลำดับการแทรกของ dictionary ไว้
- execution array ตรงกับ
-
โครงสร้างซ้อนและข้อจำกัด
- เมื่อโครงสร้างหนึ่งปรากฏอยู่ในอีกโครงสร้างหนึ่ง จะมีเส้นออกจากวงกลมหรือจุดเล็ก ๆ ณ ตำแหน่งที่บรรจุ แล้วเชื่อมไปยัง sigil เริ่มต้นและสิ้นสุดของ ring ย่อย
- ใน PostScript สามารถใช้
[ ]หรือ<< >>ในลักษณะที่ Mystical จัดการได้ยาก - ควรหลีกเลี่ยงรูปแบบที่แบ่งขอบเขต array ไว้ในเงื่อนไขหรือ branch เหมือนในตัวอย่าง
- คำสั่งอย่าง
gsave/grestore,begin/endมีโอกาสสูงที่จะถูกใช้แบบไม่สมดุลหรือข้าม loop จึงถูกปฏิบัติเป็น sigil ทั่วไป
ข้อความและ sigil
- บริเวณขอบของ ring จะมี ข้อความ หรือ sigil วางอยู่
- name ที่เขียนเป็น
/nameใน PostScript จะแสดงใน Mystical เป็น สามเหลี่ยม ที่ล้อมหรือทับข้อความชื่อหรือ sigil ของ name นั้น - string
()ของ PostScript แสดงเป็นรูปแบบ cartouche ที่มีข้อความ string อยู่ภายใน -
sigil มาตรฐาน
- operator ในตัวจำนวนมากมี sigil มาตรฐาน ของตัวเอง
- เมื่อปรากฏเป็น operator หรือ name จะใช้ sigil แทนข้อความ แต่จะไม่ใช้เมื่ออยู่ใน string
- โดยทั่วไป sigil มาตรฐานสร้างจากการผสมตัวอักษรแรกของคำสั่งกับภาพแนวคิด และบางส่วนใช้ภาพที่อธิบายได้มากขึ้นหรือภาษาภาพที่เป็นมาตรฐาน
- ดูรายการทั้งหมดได้ที่ Standard Sigils
- หมวด operator ที่ยกตัวอย่าง
dup,copy,add,mul,negfor,forall,repeatif,ifelse, comparison operatorsmoveto,lineto,arc,curveto,stroke,fillgsave,grestore,translate,scale,rotate- operator สำหรับตั้งค่าและอ่านค่าสี
dict,begin,end,def,get,put,length
-
sigil ผู้ใช้
- สามารถเพิ่ม sigil ของฟังก์ชันหรือ name ใหม่เข้า
sigil_bankได้ตอน runtime - sigil ผู้ใช้ต้องอยู่ภายใน สี่เหลี่ยมจัตุรัส 1 หน่วย ที่มีจุดกำเนิดเป็นศูนย์กลาง และค่าพิกัดต้องไม่เกิน 0.5
- เพื่อความสะดวก สามารถแปลงระบบพิกัดได้
- หากใช้
nstrokeแทนstrokeจะได้ เอฟเฟกต์แบบลายมือประดิษฐ์ เหมือน sigil มาตรฐาน - sigil สำหรับตัวแปรผู้ใช้สามารถออกแบบด้วยระบบ sigil แบบใดก็ได้
- ตัวอย่างส่วนใหญ่ใช้ letter collision ที่ได้แรงบันดาลใจจากระบบ Chaos Magick ของ Spare
- kameas, wheels, Square Word Calligraphy, Circular Gallifreyan, sitelen sitelen, ภาพวาด, มุกเล่นคำ ฯลฯ ก็เป็นไปได้
- name ใหม่ที่สืบทอดจาก operator ทางการสามารถรวม sigil มาตรฐานของ operator นั้นได้
- สามารถเพิ่ม sigil ของฟังก์ชันหรือ name ใหม่เข้า
สัญลักษณ์เชื่อมสำหรับ /name { ring } def
- แม้
defจะมี sigil แยกต่างหาก แต่แพตเทิร์นที่ push name แล้ว push function จากนั้นกำหนด function นั้นให้กับ name นั้นปรากฏบ่อย - Mystical มี ไวยากรณ์พิเศษ สำหรับรูปแบบ
/name { ring } def- ใช้สามเหลี่ยม name แบบปกติ
- ปลายเส้นเชื่อมวางอยู่ใต้ name โดยตรง
- ละเว้น sigil ของ
defไปทั้งหมด
- เพื่อให้เรียบง่าย ไวยากรณ์นี้จึงขยายไปยัง ring อีกสองประเภทด้วย
- เมื่อใช้
defในรูปแบบอื่น จะใช้ sigildefปกติตามเดิม - เคยพิจารณาสัญลักษณ์เชื่อมที่คล้ายกันสำหรับ
/name { ring }ภายใน dictionary แต่ไม่ได้ใช้เพราะมีโอกาสประมวลผลผิดสูง
วิธีจัดการคอมเมนต์
- คอมเมนต์ของ Mystical แสดงเป็นข้อความขนาดเล็กภายใน กรอบคำพูดที่ไม่สมบูรณ์ ซึ่งชี้ไปยังจุดใดจุดหนึ่งในโปรแกรม
- คอมเมนต์ PostScript จริงจะหายไปก่อนที่ renderer ของ Mystical จะเห็น ดังนั้น
mystify.pyจึงแปลงคอมเมนต์เป็นลำดับโค้ดที่ตรวจจับได้ - ตัวอย่างเช่น คอมเมนต์อย่าง
% Show a standard message, centered horizontallyจะถูกแปลงเป็นรูปแบบต่อไปนี้(Show a standard message, centered horizontally) /mystical_comment_flag pop pop
- renderer สามารถตรวจจับแพตเทิร์นนี้และแสดงเป็นคอมเมนต์ Mystical ได้
อัลกอริทึมตัวอย่าง
- ภาพด้านบนของหน้าเป็นตัวอย่าง Quicksort
- มีตัวอย่างอัลกอริทึม GCD ของ Euclid รวมอยู่ด้วย
- ตัวอย่างนี้ใช้ฟังก์ชัน
/arg {exch def} defของ dmmlib
- ตัวอย่างนี้ใช้ฟังก์ชัน
ฟังก์ชันสร้างภาพ Mystical
- ฟังก์ชันทั้งหมดนิยามอยู่ใน
mystical.ps mystical- รับ array, execution array หรือ dictionary แล้วเรนเดอร์เป็นรูปแบบ Mystical
- หากจำเป็น จะไล่ลงไปวาดถึงโครงสร้างย่อยด้วย
- ภาพทั้งหมดถูกสเกลให้พอดีกับ unit circle
mystical_evoke- เหมือน
mysticalแต่รับ name ที่จะค้นหาใน dictionary ปัจจุบันเป็นอินพุต
- เหมือน
mystical_evoke_label- คล้าย
mystical_evokeแต่เพิ่มสัญลักษณ์เชื่อม name-definition ไว้ด้านบน - หมุนภาพเพื่อให้ sigil ของ name มองตรง
- คล้าย
- ทั้งสามฟังก์ชันมีเวอร์ชันที่ต่อท้ายด้วย
_unscaled- เวอร์ชันเหล่านี้ข้ามขั้นตอนการสเกล
- เนื่องจากความหนาของ ring คือ 1 หน่วย ภาพจึงมีขนาดค่อนข้างใหญ่
- วิธีใช้อยู่ใน Mystical usage notes
โปรแกรมสร้างภาพ Mystical
- โปรแกรมที่ให้มาในปัจจุบันมีเพียงสคริปต์ Python
mystify.pyหนึ่งตัว mystify.pyทำงานสองอย่าง- ห่อโปรแกรม PostScript ทั้งหมดด้วยโค้ดที่วาดเป็นโปรแกรม Mystical และจัดวางไว้กึ่งกลางหน้า 8.5x11 ด้วย ความกว้าง 8 นิ้ว
- แปลงบรรทัดคอมเมนต์ PostScript ที่ขึ้นต้นด้วย
%เป็นคอมเมนต์ Mystical
- ไม่แปลงคอมเมนต์ที่ต้นไฟล์
- เช่น
%!PS
- เช่น
- บรรทัดคอมเมนต์ที่อยู่ติดกันและมีระยะเยื้องเท่ากันจะถูกจัดเป็นคอมเมนต์ยาวรายการเดียวที่มีการขึ้นบรรทัด
-
ข้อจำกัดด้านเลย์เอาต์
- โค้ดปัจจุบันคำนวณเลย์เอาต์เพื่อไม่ให้วงกลมย่อยชนกัน
- การคำนวณนี้เผื่อปลอดภัยมากเกินไป ทำให้โปรแกรมส่วนใหญ่อาจกระจายกว้างมาก
- ตัวอย่างบนหน้าสร้างขึ้นโดยรันฟังก์ชัน parsing/layout อย่าง
mystical_get_spell,mystical_make_evocation_ligatureแล้วปรับผลลัพธ์ และเรียกdraw_sigil,draw_link - มีแผนจะปรับปรุงเลย์เอาต์เริ่มต้น
มองว่าเป็นภาษาได้หรือไม่
- ปัจจุบัน Mystical คือวิธีวาดโปรแกรม PostScript
- ยังไม่มี interpreter ที่รับภาพ Mystical เป็นอินพุตแล้วทำการคำนวณที่เหมาะสม
- มนุษย์อาจอ่านภาพ Mystical แล้วรันได้ หรือเป็นไปได้มากกว่าคือมนุษย์แปลงมันเป็นโปรแกรม PostScript แล้วจึงรัน
ความเป็นไปได้ในการประยุกต์กับภาษาอื่น
- แนวทางนี้ดูเหมือนจะใช้ได้กับ ภาษาที่มีแต่ operator อย่าง Forth
- อาจนำไปใช้กับภาษาที่มีโครงสร้างประโยคซับซ้อนกว่านี้ได้ยาก
- ยังไม่ทราบว่าการสร้าง ring ใหม่ทุกครั้งที่เจอวงเล็บปีกกาหรือการเยื้องจะทำให้ซับซ้อนเกินไปหรือไม่
ยังไม่มีความคิดเห็น