ミスティカル
(suberic.net)- ミスティカルは、魔法陣の形で PostScript プログラムを視覚化する独特な方式
- プログラミング構造をリング形式で表現し、実行配列、非実行配列、辞書などのさまざまな型がある
- シジルという特殊シンボルによって、命令や変数、文字列などを独自に表す
- 定義パターンや関数宣言には、別個の**合字(ligature)**表現が適用され、ユーザー定義シジルにも対応
- 現在は PostScript プログラムをグラフィック画像に変換するツールであり、独自インタプリタは存在しない
ミスティカル(Mystical)概要
ミスティカルは、魔法陣に似たプログラミング言語を目指した実験的プロジェクト。実際には、魔法陣の形で PostScript コードを視覚的に表現する方式であり、この文書ではこの方法を「ミスティカル」と呼んでいる。
リング構造
- ミスティカルの構造はリング形状を中心とする
- 各リングは文字とシジルを含み、内側と外側の境界線を持つ
- プログラムのメインリングは右側(3時方向)から始まり、**反時計回り(widdershins)**に進む。これは PostScript の角度規則と、魔法陣が外側から内側へ書かれるという概念を反映している
- 下位リングは上位リングの接点から始まる
リングの3種類
- 実行配列(Executable array): PostScript の
{}に相当。内外に単純な円形境界と星形があり、開始/終了には錬金術記号ベースのシンボルを使用 - 非実行配列(Non-executable array): PostScript の
[]に相当。星形はなく、開始/終了に三角形を使用 - 辞書(Dictionary): PostScript の
<<>>に相当。多角形状で、二重の外側境界と単一の内側境界を持つ。開始/終了表示は同じ
リング内に別の構造が入るときは、小さな点または線で接続して階層を視覚的に表現する
PostScript 利用上の制限
- PostScript では
[ ]または<< >>をミスティカルの規則上許容されない形で使えるため、推奨されない gsave/grestore、begin/endなどは非対称な構造で使われることが多いため、通常のシジルとして扱う
テキストとシジル(Sigils)
- リングの縁には文字またはシジル(特殊シンボル)が配置される
- シジルは演算子、変数、キーワードを表す
- PostScript の
/nameは三角形の中に名前またはシジルとして、文字列()は巻物形として表現される
標準シジル(Standard Sigils)
- 多くの組み込み演算子に対して固有のシジルが存在する
- 通常は命令の頭文字、概念の図像、または視覚言語として設計される
例: 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 など
ユーザーシジル(User Sigils)
- 新しい関数や名前に対して、実行時に
sigil_bankへ追加可能 - 1ユニット四方の正方形内に収まるよう設計する必要がある(座標変換は可能)
nstrokeを使うと既存シジルと同じ書体効果を出せる- ユーザー変数用シジルは、文字の重ね合わせやさまざまな視覚言語など、多様な方法で作成できる
- 公式演算子ベースの新しい名前は標準シジルと組み合わせ可能
/name { ring } def 合字シジル(Ligature)
- 関数定義などで頻繁に使うパターンのための特殊シジルを提供
- 名前の三角形の下に接続線だけを表し、個別の
defシジルは省略する - 3種類すべてのリング型に適用可能
- それ以外の
defの使用は通常のシジルとして扱う - 実行配列内でのみ適用し、辞書内では使用上の混乱を避けるため提供しない
サンプルアルゴリズム
上部の図は**クイックソート(Quicksort)**の例。
ユークリッドの最大公約数(GCD)アルゴリズムの例もある。この例ではユーザー関数 /arg {exch def} def を使っている。
ミスティカル画像生成関数
すべて "mystical.ps" に定義されている
- mystical: 配列、実行配列、または辞書を受け取り、内部構造まで再帰的に視覚化する。全体画像は単位円に収まるようスケーリングされる
- mystical_evoke: 名前を受け取り、現在の辞書から検索して上記のようにレンダリングする
- mystical_evoke_label: 名前-def 合字シジルを追加し、名前シジルが垂直に見えるよう向きを調整する
これらの関数には _unscaled 版もある。この場合はスケーリングできず、リングが非常に大きく出力される
レイアウトの問題
- 現在のコードは下位円の配置を衝突なしで最適化するが、保守的なため配置が過度に広がる
- 例示図では
mystical_get_spell、mystical_make_evocation_ligatureなどで解析/配置した後、draw_sigil、draw_link 関数で手動調整して図を出力している - 今後はレイアウトのデフォルト設定を改善する予定
プログラミング言語としてのミスティカル
- 現在のミスティカルはPostScript プログラムを描画するツール
- ミスティカル画像自体を解釈実行するインタプリタはない
- 人が画像を見て PostScript コードを理解するか、PostScript プログラムとして書き直して実行する方式
- 言語としての議論は今後に持ち越す
他言語への適用可能性
- FORTH のように演算子だけで構成される言語では活用の可能性が高い
- 構造がより複雑な言語では、適用時にリングが過剰に増えるおそれがある
このページは 2025-05-16 に Denis によって作成された
1件のコメント
Hacker Newsの感想