มิสติคัล
(suberic.net)- มิสติคัล เป็นแนวทางอันเป็นเอกลักษณ์ในการทำให้โปรแกรม PostScript มองเห็นได้ในรูปแบบวงเวท
- โครงสร้างโปรแกรมถูกแสดงในรูปแบบ วงแหวน (ring) และมีหลายประเภท เช่น executable array, non-executable array, dictionary
- ใช้สัญลักษณ์พิเศษที่เรียกว่า sigil เพื่อแทนคำสั่ง ตัวแปร สตริง ฯลฯ อย่างมีเอกลักษณ์
- สำหรับแพตเทิร์นการนิยามหรือการประกาศฟังก์ชัน จะใช้การแสดงผลแบบ ligature แยกต่างหาก และรองรับ sigil แบบกำหนดเอง
- ปัจจุบันเป็นเครื่องมือสำหรับ แปลงโปรแกรม PostScript เป็นภาพกราฟิก และยังไม่มีอินเทอร์พรีเตอร์ของตัวเอง
ภาพรวมของมิสติคัล (Mystical)
มิสติคัลเป็นโปรเจ็กต์เชิงทดลองที่มุ่งสู่การเป็น ภาษาโปรแกรมที่มีลักษณะคล้ายวงเวท ในทางปฏิบัติแล้ว มันคือวิธีการแสดงโค้ด PostScript ในรูปแบบภาพที่เป็นวงเวท และในเอกสารนี้จะเรียกวิธีดังกล่าวว่า "มิสติคัล"
โครงสร้างวงแหวน (Rings)
- โครงสร้างของมิสติคัลมี รูปแบบวงแหวน เป็นแกนหลัก
- วงแหวนแต่ละวงบรรจุตัวอักษรและ sigil และมีเส้นขอบด้านในกับด้านนอก
- วงแหวนหลักของโปรแกรมเริ่มจากด้านขวา (ตำแหน่ง 3 นาฬิกา) แล้วดำเนินไป ทวนเข็มนาฬิกา (widdershins) ซึ่งสะท้อนทั้งกฎเรื่องมุมของ PostScript และแนวคิดที่ว่าวงเวทถูกเขียนจากด้านนอกสู่ด้านใน
- วงแหวนย่อยเริ่มต้นที่จุดเชื่อมกับวงแหวนระดับบน
วงแหวนมี 3 ประเภท
- Executable array : ตรงกับ
{}ของ PostScript ใช้เส้นขอบวงกลมแบบเรียบทั้งด้านในและด้านนอก พร้อมลวดลายรูปดาว และใช้สัญลักษณ์ที่อิงจากเครื่องหมายเล่นแร่แปรธาตุสำหรับจุดเริ่ม/จุดจบ - Non-executable array : ตรงกับ
[]ของ PostScript ไม่มีลวดลายรูปดาว และใช้รูปสามเหลี่ยมเป็นจุดเริ่ม/จุดจบ - Dictionary : ตรงกับ
<<>>ของ PostScript มีรูปทรงหลายเหลี่ยม ขอบนอกสองชั้น และขอบในชั้นเดียว โดยใช้เครื่องหมายเริ่ม/จบแบบเดียวกัน
เมื่อมีโครงสร้างอีกชั้นอยู่ภายในวงแหวน จะเชื่อมด้วย จุดเล็กหรือเส้น เพื่อแสดงลำดับชั้นในเชิงภาพ
ข้อจำกัดในการใช้งาน PostScript
- ใน PostScript สามารถใช้
[ ]หรือ<< >>ในลักษณะที่กฎของมิสติคัลไม่อนุญาตได้ จึงไม่แนะนำ gsave/grestore,begin/endเป็นต้น มักถูกใช้กับโครงสร้างที่ไม่สมดุลมากกว่า จึงถูกจัดการเป็น sigil ทั่วไป
ข้อความและ sigil
- บนขอบของวงแหวนจะวางตัวอักษรหรือ sigil (สัญลักษณ์พิเศษ)
- sigil ใช้แทน operator, variable, keyword
/nameของ PostScript จะแสดงเป็น ชื่อหรือ sigil ภายในสามเหลี่ยม ส่วนสตริง()จะแสดงเป็น รูปม้วนคัมภีร์
Sigil มาตรฐาน (Standard Sigils)
- มี sigil เฉพาะตัว สำหรับ operator ที่มีมาในตัวจำนวนมาก
- โดยทั่วไปออกแบบจากอักษรย่อของคำสั่ง ภาพแทนแนวคิด หรือภาษาภาพในเชิงสัญลักษณ์
ตัวอย่าง: 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 เป็นต้น
Sigil แบบผู้ใช้กำหนดเอง (User Sigils)
- สำหรับ ฟังก์ชันหรือชื่อใหม่ สามารถเพิ่มลงใน
sigil_bankได้ขณะรันไทม์ - ต้องออกแบบให้อยู่ภายในสี่เหลี่ยมจัตุรัสขนาด 1 หน่วย (สามารถแปลงพิกัดได้)
- เมื่อใช้
nstrokeจะได้เอฟเฟกต์แบบอักษรเช่นเดียวกับ sigil ที่มีอยู่เดิม - sigil สำหรับตัวแปรที่ผู้ใช้สร้างเอง สามารถออกแบบได้หลายวิธี เช่น การซ้อนตัวอักษร หรือใช้ภาษาภาพที่หลากหลาย
- ชื่อใหม่ที่อิงจาก operator ทางการสามารถผสมกับ sigil มาตรฐานได้
Ligature สำหรับ /name { ring } def
- มี sigil พิเศษสำหรับ แพตเทิร์นที่ใช้บ่อย เช่น การนิยามฟังก์ชัน
- แสดงเพียงเส้นเชื่อมใต้สามเหลี่ยมชื่อ และละ
defsigil ออกไป - ใช้ได้กับวงแหวนทั้งสามประเภท
- การใช้
defในกรณีอื่นจะยังคงแสดงเป็น sigil ปกติ - ใช้ได้เฉพาะภายใน executable array เท่านั้น และไม่รองรับใน dictionary เพราะอาจทำให้การใช้งานสับสน
ตัวอย่างอัลกอริทึม
ภาพด้านบนเป็นตัวอย่างของ Quicksort
ยังมีตัวอย่างอัลกอริทึม Euclid greatest common divisor (GCD) ซึ่งใช้ฟังก์ชันผู้ใช้กำหนดเอง /arg {exch def} def
ฟังก์ชันสำหรับสร้างภาพมิสติคัล
ทั้งหมดถูกนิยามไว้ใน "mystical.ps"
- mystical: รับ array, executable array หรือ dictionary แล้วทำการสร้างภาพเชิงภาพของโครงสร้างภายในแบบเรียกซ้ำ โดยภาพทั้งหมดจะถูกปรับสเกลให้พอดีกับวงกลมหน่วย
- mystical_evoke: รับชื่อ แล้วค้นหาใน current dictionary ก่อนเรนเดอร์ในแบบเดียวกับด้านบน
- mystical_evoke_label: เพิ่ม ligature แบบ name-def และปรับทิศทางเพื่อให้ name sigil มองเห็นในแนวตั้ง
ฟังก์ชันเหล่านี้ยังมีเวอร์ชัน _unscaled ด้วย ซึ่งในกรณีนั้นจะไม่สามารถปรับสเกลได้ ทำให้วงแหวนถูกพิมพ์ออกมาใหญ่เกินมาก
ปัญหาด้านเลย์เอาต์
- โค้ดปัจจุบันสามารถจัดวางวงกลมย่อยโดยหลีกเลี่ยงการชนกันและพยายามหาตำแหน่งที่เหมาะสม แต่ค่อนข้างระมัดระวังเกินไป จึงทำให้การจัดวางแผ่ออกมากเกินจำเป็น
- ในภาพตัวอย่าง มีการใช้
mystical_get_spell,mystical_make_evocation_ligatureเป็นต้น เพื่อพาร์สและจัดวาง จากนั้นจึงวาดภาพด้วยการปรับด้วยมือผ่านฟังก์ชัน draw_sigil, draw_link - มีแผนจะปรับปรุงค่าตั้งต้นของเลย์เอาต์ในอนาคต
มิสติคัลในฐานะภาษาโปรแกรม
- ปัจจุบันมิสติคัลเป็น เครื่องมือสำหรับวาดโปรแกรม PostScript
- ไม่มีอินเทอร์พรีเตอร์ที่ใช้ตีความและรันภาพมิสติคัลโดยตรง
- มนุษย์ต้องดูภาพเพื่อทำความเข้าใจโค้ด PostScript หรือเขียนกลับเป็นโปรแกรม PostScript แล้วจึงรัน
- ประเด็นด้านภาษาจะเก็บไว้พิจารณาในภายหลัง
ความเป็นไปได้ในการประยุกต์ใช้กับภาษาอื่น
- กับภาษาที่ประกอบด้วย operator เป็นหลัก เช่น FORTH มีความเป็นไปได้สูงในการนำไปใช้
- สำหรับภาษาที่มีโครงสร้างซับซ้อนกว่านี้ อาจมีความเสี่ยงที่จำนวนวงแหวนจะมากเกินไปเมื่อนำไปใช้
หน้านี้ถูกสร้างโดย Denis เมื่อ 2025-05-16
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News