Mystical
(suberic.net)- Mystical adalah pendekatan unik untuk memvisualisasikan program PostScript dalam bentuk lingkaran sihir
- Struktur pemrograman direpresentasikan dalam bentuk ring dan mencakup berbagai tipe seperti executable array, non-executable array, dan dictionary
- Simbol khusus yang disebut sigil digunakan untuk merepresentasikan perintah, variabel, string, dan lainnya dengan cara yang khas
- Untuk pola definisi atau deklarasi fungsi, digunakan representasi ligature khusus, dan sigil kustom pengguna juga didukung
- Saat ini ini adalah alat untuk mengubah program PostScript menjadi gambar grafis, dan belum memiliki interpreter sendiri
Gambaran Umum Mystical
Mystical adalah proyek eksperimental yang bertujuan menjadi bahasa pemrograman yang menyerupai lingkaran sihir. Dalam praktiknya, ini adalah cara untuk merepresentasikan kode PostScript secara visual dalam bentuk lingkaran sihir, dan dalam dokumen ini metode tersebut dinamai 'Mystical'.
Struktur Ring
- Struktur Mystical berpusat pada bentuk ring
- Setiap ring berisi huruf dan sigil, serta memiliki garis batas dalam dan luar
- Ring utama program dimulai dari sisi kanan (arah jam 3) dan bergerak berlawanan arah jarum jam (widdershins). Ini mencerminkan aturan sudut PostScript dan gagasan bahwa lingkaran sihir ditulis dari luar ke dalam
- Ring turunan dimulai dari titik pertemuan pada ring induknya
Tiga jenis ring
- Executable array: setara dengan
{}di PostScript. Memiliki batas melingkar sederhana di bagian dalam dan luar serta bentuk bintang, dengan simbol awal/akhir berbasis lambang alkimia - Non-executable array: setara dengan
[]di PostScript. Tidak memiliki bentuk bintang, menggunakan segitiga untuk awal/akhir - Dictionary: setara dengan
<<>>di PostScript. Berbentuk poligon dengan batas luar ganda dan batas dalam tunggal. Penanda awal/akhir sama
Ketika struktur lain masuk ke dalam sebuah ring, strukturnya dihubungkan dengan titik kecil atau garis untuk menampilkan hierarki secara visual
Batasan penggunaan PostScript
- Dalam PostScript,
[ ]atau<< >>bisa dipakai dengan cara yang tidak diizinkan menurut aturan Mystical, sehingga tidak disarankan gsave/grestore,begin/end, dan sebagainya lebih sering digunakan untuk struktur yang tidak seimbang, sehingga diperlakukan sebagai sigil biasa
Teks dan Sigil
- Pada tepi ring ditempatkan karakter atau sigil (simbol khusus)
- Sigil merepresentasikan operator, variabel, kata kunci
/namedi PostScript direpresentasikan sebagai nama atau sigil di dalam segitiga, sedangkan string()direpresentasikan sebagai bentuk gulungan
Sigil Standar
- Banyak operator bawaan memiliki sigil unik
- Biasanya dirancang berdasarkan inisial perintah, gambar konsep, atau bahasa visual
Contoh: 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, dll.
Sigil Pengguna
- Untuk fungsi atau nama baru, sigil dapat ditambahkan ke
sigil_banksaat runtime - Perlu didesain agar muat dalam bujur sangkar 1 unit (transformasi koordinat dimungkinkan)
- Saat memakai
nstroke, efek tipografinya bisa dibuat sama seperti sigil yang sudah ada - Sigil untuk variabel pengguna dapat dibuat dengan berbagai cara, seperti menumpuk huruf atau memakai beragam bahasa visual
- Nama baru berbasis operator resmi dapat digabungkan dengan sigil standar
Ligature /name { ring } def
- Disediakan sigil khusus untuk pola yang sering dipakai dalam definisi fungsi dan sejenisnya
- Hanya menampilkan garis penghubung di bawah segitiga nama, dan sigil
defterpisah dihilangkan - Dapat diterapkan pada ketiga tipe ring
- Penggunaan
deflainnya diperlakukan sebagai sigil biasa - Hanya diterapkan di dalam executable array; tidak disediakan di dalam dictionary karena bisa menimbulkan kebingungan penggunaan
Algoritme Contoh
Gambar di bagian atas adalah contoh Quicksort
Contoh algoritme FPB Euclid (GCD) juga disediakan. Contoh tersebut memanfaatkan fungsi pengguna /arg {exch def} def
Fungsi Pembuat Gambar Mystical
Semuanya didefinisikan dalam "mystical.ps"
- mystical: menerima array, executable array, atau dictionary, lalu memvisualisasikannya secara rekursif hingga ke struktur internalnya. Seluruh gambar diskalakan agar muat dalam lingkaran satuan
- mystical_evoke: menerima sebuah nama, mencarinya di dictionary saat ini, lalu merendernya seperti di atas
- mystical_evoke_label: menambahkan ligature nama-def dan menyesuaikan orientasi agar sigil nama terlihat vertikal
Fungsi-fungsi tersebut juga memiliki versi _unscaled. Dalam kasus ini penskalaan tidak dilakukan sehingga ring dicetak sangat besar
Masalah Tata Letak
- Kode saat ini mengoptimalkan penempatan lingkaran turunan agar tidak bertabrakan, tetapi masih konservatif sehingga tata letaknya terlalu melebar
- Pada gambar contoh, parsing dan penempatan dilakukan dengan
mystical_get_spell,mystical_make_evocation_ligature, dan lainnya, lalu gambar dihasilkan dengan penyesuaian langsung melalui fungsi draw_sigil dan draw_link - Pengaturan bawaan tata letak akan ditingkatkan di masa mendatang
Mystical sebagai Bahasa Pemrograman
- Saat ini Mystical adalah alat untuk menggambar program PostScript
- Belum ada interpreter yang dapat menafsirkan dan mengeksekusi gambar Mystical itu sendiri
- Manusia melihat gambar tersebut untuk memahami kode PostScript, atau menuliskannya ulang sebagai program PostScript untuk dieksekusi
- Pembahasan sebagai bahasa akan ditunda untuk nanti
Kemungkinan Penerapan ke Bahasa Lain
- Untuk bahasa yang hanya terdiri dari operator seperti FORTH, ada potensi besar untuk digunakan
- Pada bahasa dengan struktur yang lebih kompleks, ada kekhawatiran jumlah ring akan menjadi terlalu banyak
Halaman ini dibuat oleh Denis pada 2025-05-16
1 komentar
Komentar Hacker News