• 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 ไว้
  • โครงสร้างซ้อนและข้อจำกัด

    • เมื่อโครงสร้างหนึ่งปรากฏอยู่ในอีกโครงสร้างหนึ่ง จะมีเส้นออกจากวงกลมหรือจุดเล็ก ๆ ณ ตำแหน่งที่บรรจุ แล้วเชื่อมไปยัง 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, neg
      • for, forall, repeat
      • if, ifelse, comparison operators
      • moveto, lineto, arc, curveto, stroke, fill
      • gsave, 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 นั้นได้

สัญลักษณ์เชื่อมสำหรับ /name { ring } def

  • แม้ def จะมี sigil แยกต่างหาก แต่แพตเทิร์นที่ push name แล้ว push function จากนั้นกำหนด function นั้นให้กับ name นั้นปรากฏบ่อย
  • Mystical มี ไวยากรณ์พิเศษ สำหรับรูปแบบ /name { ring } def
    • ใช้สามเหลี่ยม name แบบปกติ
    • ปลายเส้นเชื่อมวางอยู่ใต้ name โดยตรง
    • ละเว้น sigil ของ def ไปทั้งหมด
  • เพื่อให้เรียบง่าย ไวยากรณ์นี้จึงขยายไปยัง ring อีกสองประเภทด้วย
  • เมื่อใช้ def ในรูปแบบอื่น จะใช้ sigil def ปกติตามเดิม
  • เคยพิจารณาสัญลักษณ์เชื่อมที่คล้ายกันสำหรับ /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 ใหม่ทุกครั้งที่เจอวงเล็บปีกกาหรือการเยื้องจะทำให้ซับซ้อนเกินไปหรือไม่

ดาวน์โหลด

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น