3 điểm bởi GN⁺ 2025-05-18 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp
  • Mystical là một dạng ký pháp vẽ chương trình PostScript thành cấu trúc hình tròn trông như ma pháp trận; tài liệu xem nó như một ngôn ngữ, nhưng thực tế nó gần với một biểu diễn trực quan của PostScript hơn
  • Cấu trúc cốt lõi là vòng (ring); mảng thực thi {}, mảng không thực thi [] và dictionary << >> được phân biệt bằng viền, ngôi sao, tam giác và đa giác
  • Văn bản ở rìa vòng và sigil biến các toán tử, biến, từ khóa, chuỗi và tên trong PostScript thành ký hiệu hoặc dạng trang trí
  • mystical.ps render mảng, mảng thực thi và dictionary thành hình ảnh Mystical; mystify.py bọc chương trình PostScript thành hình Mystical rộng 8 inch trên trang 8.5x11, đồng thời chuyển đổi cả chú thích
  • Hiện không có trình thông dịch đọc hình ảnh Mystical để tính toán; mới ở mức con người có thể chuyển hình ảnh sang PostScript rồi chạy

Ký pháp vẽ PostScript như ma pháp trận

  • Mystical bắt đầu từ mục tiêu tạo ra một ngôn ngữ lập trình giống ma pháp trận
  • Thực tế, nó gần với một cách viết hoặc vẽ PostScript sao cho trông như ma pháp trận
  • Tài liệu cài đặt và nhập môn được cung cấp riêng

Cấu trúc dựa trên vòng

  • Chương trình Mystical được cấu thành từ các vòng (ring)
  • Vòng là một dải tròn có viền trong và viền ngoài, trong đó bố trí văn bản và sigil
  • Nội dung của vòng chính bắt đầu ở mép phải, tức hướng 3 giờ, rồi chạy ngược chiều kim đồng hồ
    • Điều này tuân theo hệ góc của PostScript, đồng thời phản ánh giả định rằng vòng được viết từ phía ngoài
  • Vòng con bắt đầu tại điểm nối với cấu trúc đã gọi nó
  • Ba loại vòng

    • Mảng thực thi tương ứng với { } trong PostScript; có viền tròn đơn giản ở trong và ngoài, bên trong có hình ngôi sao
    • Điểm bắt đầu và kết thúc của mảng thực thi được đánh dấu bằng ký hiệu lấy từ biểu tượng “hoàn tất công việc” trong thuật giả kim
    • Mảng không thực thi tương ứng với [ ] trong PostScript; tương tự mảng thực thi nhưng không có hình ngôi sao
    • Điểm bắt đầu và kết thúc của mảng không thực thi được đánh dấu bằng tam giác đơn giản
    • Dictionary tương ứng với << >> trong PostScript; được biểu diễn bằng đa giác có viền ngoài kép và viền trong đơn
    • Dấu hiệu điểm bắt đầu và kết thúc của dictionary giống với mảng
    • Thứ tự mục trong hình ảnh dictionary có thể khác với văn bản PostScript
      • Vì trong PostScript, thứ tự chèn vào dictionary không được bảo toàn
  • Cấu trúc lồng nhau và ràng buộc

    • Khi một cấu trúc xuất hiện bên trong cấu trúc khác, một đường sẽ đi ra từ vòng tròn nhỏ hoặc chấm tại điểm chứa và nối tới sigil bắt đầu/kết thúc của vòng con
    • Trong PostScript, [ ] hoặc << >> có thể được dùng theo những cách Mystical khó xử lý
    • Nên tránh các dạng chia ranh giới mảng vào bên trong câu điều kiện hoặc nhánh như trong ví dụ
    • Các lệnh như gsave/grestore, begin/end có khả năng cao được dùng mất cân bằng hoặc cắt ngang vòng lặp, nên được xử lý như sigil thông thường

Văn bản và sigil

  • Ở rìa vòng có đặt văn bản hoặc sigil
  • Tên được viết dưới dạng /name trong PostScript được biểu diễn trong Mystical bằng tam giác bao quanh hoặc chồng lên văn bản tên hoặc sigil
  • Chuỗi () của PostScript được biểu diễn dưới dạng cartouche chứa văn bản chuỗi
  • Sigil chuẩn

    • Nhiều toán tử tích hợp có sigil chuẩn riêng
    • Khi xuất hiện dưới dạng toán tử hoặc tên thì dùng sigil thay cho văn bản, nhưng không áp dụng bên trong chuỗi
    • Sigil chuẩn phần lớn được tạo bằng cách kết hợp chữ cái đầu của lệnh với hình ảnh của khái niệm; một số dùng hình ảnh mang tính mô tả hơn hoặc ngôn ngữ thị giác được chuẩn hóa
    • Có thể xem danh sách đầy đủ tại Standard Sigils
    • Các nhóm toán tử được dùng làm ví dụ
      • dup, copy, add, mul, neg
      • for, forall, repeat
      • if, ifelse, toán tử so sánh
      • moveto, lineto, arc, curveto, stroke, fill
      • gsave, grestore, translate, scale, rotate
      • Toán tử đặt và truy vấn màu
      • dict, begin, end, def, get, put, length
  • Sigil người dùng

    • Sigil của hàm hoặc tên mới có thể được thêm vào sigil_bank lúc runtime
    • Sigil người dùng phải nằm trong hình vuông 1 đơn vị lấy gốc tọa độ làm tâm, và giá trị tọa độ không được vượt quá 0.5
    • Có thể biến đổi hệ tọa độ để tiện sử dụng
    • Nếu dùng nstroke thay cho stroke, sẽ có được hiệu ứng thư pháp giống sigil chuẩn
    • Sigil cho biến người dùng có thể được thiết kế theo bất kỳ hệ sigil nào
    • Ví dụ chủ yếu dùng letter collision lấy cảm hứng từ hệ Chaos Magick của Spare
    • Cũng có thể dùng kameas, wheels, Square Word Calligraphy, Circular Gallifreyan, sitelen sitelen, hình vẽ, chơi chữ, v.v.
    • Tên mới phái sinh từ toán tử chính thức có thể bao gồm sigil chuẩn của toán tử đó

Ký pháp kết hợp cho /name { ring } def

  • def có sigil riêng, nhưng mẫu đẩy tên, đẩy hàm rồi định nghĩa hàm đó cho tên này xuất hiện thường xuyên
  • Mystical cung cấp cú pháp đặc biệt cho dạng /name { ring } def
    • Dùng tam giác tên thông thường
    • Đầu của đường nối được đặt ngay bên dưới tên
    • Sigil def bị lược bỏ hoàn toàn
  • Cú pháp này cũng được mở rộng sang hai loại vòng còn lại để đơn giản hóa
  • Khi dùng def theo cách khác, sigil def thông thường vẫn được sử dụng
  • Từng cân nhắc ký pháp kết hợp tương tự cho /name { ring } bên trong dictionary, nhưng không áp dụng vì khả năng xử lý sai cao

Cách xử lý chú thích

  • Chú thích của Mystical được biểu diễn bằng văn bản nhỏ bên trong bong bóng thoại không hoàn chỉnh trỏ tới một điểm cụ thể trong chương trình
  • Chú thích PostScript thực tế biến mất trước khi renderer Mystical nhìn thấy, nên mystify.py chuyển chú thích thành chuỗi mã có thể nhận diện
  • Ví dụ, chú thích như % Show a standard message, centered horizontally được chuyển thành dạng sau
    • (Show a standard message, centered horizontally) /mystical_comment_flag pop pop
  • Renderer có thể phát hiện mẫu này và hiển thị thành chú thích Mystical

Thuật toán mẫu

  • Hình ở đầu trang là ví dụ Quicksort
  • Cũng có ví dụ về thuật toán GCD của Euclid
    • Ví dụ này dùng hàm /arg {exch def} def của dmmlib

Hàm tạo hình ảnh Mystical

  • Tất cả hàm đều được định nghĩa trong mystical.ps
  • mystical
    • Nhận mảng, mảng thực thi, dictionary và render thành dạng Mystical
    • Khi cần, đi xuống cả các cấu trúc con để vẽ
    • Toàn bộ hình ảnh được scale vừa với đường tròn đơn vị
  • mystical_evoke
    • Giống mystical, nhưng nhận đầu vào là tên sẽ tra cứu trong dictionary hiện tại
  • mystical_evoke_label
    • Tương tự mystical_evoke, nhưng thêm ký pháp kết hợp tên-định nghĩa ở phía trên
    • Xoay hình ảnh để sigil tên hiển thị thẳng đứng
  • Cả ba hàm đều có phiên bản kèm hậu tố _unscaled
    • Các phiên bản này bỏ qua bước scaling
    • Vì độ dày vòng là 1 đơn vị, hình ảnh trở nên khá lớn
  • Cách dùng có trong Mystical usage notes

Chương trình tạo hình ảnh Mystical

  • Chương trình hiện được cung cấp chỉ là một script Python mystify.py
  • mystify.py thực hiện hai việc
    • Bọc toàn bộ chương trình PostScript bằng mã vẽ nó thành chương trình Mystical, rồi đặt ở giữa trang 8.5x11 với chiều rộng 8 inch
    • Chuyển các dòng chú thích PostScript bắt đầu bằng % thành chú thích Mystical
  • Chú thích ở đầu file không được chuyển đổi
    • Ví dụ: %!PS
  • Các dòng chú thích liền kề có cùng mức thụt lề được xử lý như một chú thích dài duy nhất có chứa xuống dòng
  • Ràng buộc bố cục

    • Mã hiện tại tính bố cục sao cho các vòng con không va chạm nhau
    • Việc tính toán quá an toàn, nên hầu hết chương trình có thể bị dàn trải rất rộng
    • Ví dụ trên trang được tạo bằng cách chạy các hàm phân tích cú pháp và bố cục mystical_get_spell, mystical_make_evocation_ligature, sau đó điều chỉnh kết quả và gọi draw_sigil, draw_link
    • Bố cục mặc định dự kiến sẽ được cải thiện

Có thể xem là ngôn ngữ không

  • Hiện tại Mystical là một cách vẽ chương trình PostScript
  • Không có trình thông dịch nhận hình ảnh Mystical làm đầu vào rồi thực hiện phép tính phù hợp
  • Con người có thể đọc hình ảnh Mystical và thực thi, hoặc khả dĩ hơn là con người chuyển nó thành chương trình PostScript rồi chạy

Khả năng áp dụng cho ngôn ngữ khác

  • Cách tiếp cận này có vẻ cũng áp dụng được cho các ngôn ngữ chỉ có toán tử như Forth
  • Có thể khó áp dụng cho các ngôn ngữ có cấu trúc câu phức tạp hơn
  • Chưa rõ việc tạo vòng mới cho mỗi cặp ngoặc nhọn hoặc mỗi mức thụt lề có khiến nó trở nên quá phức tạp hay không

Tải xuống

Chưa có bình luận nào.

Chưa có bình luận nào.