ミスティカル
(suberic.net)- Mystical は、PostScriptプログラムを魔法陣のように見える円形構造で描く表記法であり、文書では言語のように扱われているが、実際にはPostScriptの視覚的表現に近い
- 中核構造は リング(ring) で、実行配列
{}、非実行配列[]、辞書<< >>を境界線・星・三角形・多角形で区別する - リングの縁のテキストと シジル(sigil) は、PostScript演算子・変数・キーワード・文字列・名前を記号や装飾された形に変換する
mystical.psは配列・実行配列・辞書をMystical画像としてレンダリングし、mystify.pyはPostScriptプログラムを8.5x11ページ上の幅8インチのMystical図に包み、コメントも変換する- 現時点では、Mystical画像を読んで計算する インタプリタはなく、人間が画像をPostScriptに変換して実行できる程度である
PostScriptを魔法陣のように描く表記
- Mystical は、魔法陣に似たプログラミング言語を作りたいという目標から出発した
- 実際には、魔法陣のように見える形で PostScript を書いたり描いたりする方法に近い
- インストールと入門文書は別途提供されている
リングベースの構造
- Mysticalプログラムは リング(ring) で構成される
- リングは内側と外側の境界を持つ円環で、その中にテキストとシジルが配置される
- メインリングの内容は、右端の 3時方向 から始まり、反時計回りに流れる
- PostScriptの角度体系に従い、リングを外側から書くという想定も反映している
- 下位リングは、自身を呼び出した構造と接続された地点から始まる
-
3種類のリングタイプ
- 実行配列はPostScriptの
{ }に対応し、内外に単純な円形の境界があり、内部に星形が入る - 実行配列の開始・終了地点は、錬金術の「作業完了」記号に由来するシンボルで示される
- 非実行配列はPostScriptの
[ ]に対応し、実行配列に似ているが星形がない - 非実行配列の開始・終了地点は単純な三角形で示される
- 辞書はPostScriptの
<< >>に対応し、二重の外側境界と単一の内側境界を持つ 多角形 で示される - 辞書の開始・終了地点の表示は配列と同じである
- 辞書画像の項目順はPostScriptテキストと異なる場合がある
- PostScriptでは辞書の挿入順が保持されないためである
- 実行配列はPostScriptの
-
ネスト構造と制約
- ある構造が別の構造の中に現れると、包含地点の小さな円または点から線が伸び、下位リングの開始・終了シジルへ接続される
- PostScriptでは
[ ]や<< >>をMysticalが扱いにくい方法で使うことができる - 例のように、配列境界を条件文や分岐の中で分割する形は避けるべきである
gsave/grestore、begin/endのような命令は、対応が崩れたりループをまたいだりする形で使われる可能性が高いため、通常のシジルとして扱われる
テキストとシジル
- リングの縁には テキスト または シジル が置かれる
- PostScriptで
/nameと書く名前は、Mysticalでは名前テキストまたはシジルを囲む、あるいは重ねる 三角形 で表される - PostScriptの文字列
()は、文字列テキストを収めたcartouche形式で表現される -
標準シジル
- 多くの組み込み演算子には固有の 標準シジル がある
- 演算子や名前として現れる場合はテキストの代わりにシジルを使うが、文字列内では適用されない
- 標準シジルは概ね命令の頭文字と概念図を組み合わせて作られており、一部はより説明的な図や標準化された視覚言語を用いている
- 全一覧は Standard Sigils で見られる
- 例として扱われる演算子カテゴリ
dup,copy,add,mul,negfor,forall,repeatif,ifelse, 比較演算子moveto,lineto,arc,curveto,stroke,fillgsave,grestore,translate,scale,rotate- 色設定・取得演算子
dict,begin,end,def,get,put,length
-
ユーザーシジル
- 新しい関数や名前のシジルは、実行時に
sigil_bankに追加できる - ユーザーシジルは、原点を中心とした 1単位の正方形 の中に収まる必要があり、座標値は0.5を超えてはならない
- 便宜のために座標系を変換できる
strokeの代わりにnstrokeを使うと、標準シジルと同じ 書道的効果 を得られる- ユーザー変数用シジルは、どのようなシジル体系でも設計できる
- 例では、SpareのChaos Magick体系に着想を得たletter collisionを主に使っている
- kameas、wheels、Square Word Calligraphy、Circular Gallifreyan、sitelen sitelen、絵、言葉遊びなども可能である
- 公式演算子から派生した新しい名前には、その演算子の標準シジルを含めることができる
- 新しい関数や名前のシジルは、実行時に
/name { ring } def 用の結合表記
defには個別のシジルがあるが、名前をpushし、関数をpushし、その名前に関数を定義するパターンが頻繁に現れる- Mysticalは
/name { ring } def形式のための 特殊構文 を提供する- 通常の名前三角形を使う
- 接続線の端が名前のすぐ下に置かれる
defシジルは完全に省略される
- この構文は単純化のため、他の2種類のリングタイプにも拡張されている
- 別の方法で
defを使う場合は、通常のdefシジルをそのまま使う - 辞書内の
/name { ring }にも似た結合表記が検討されたが、誤処理の可能性が高いため採用されていない
コメント処理方式
- Mysticalのコメントは、プログラム内の特定地点を指す 不完全な吹き出し の中の小さなテキストで表される
- 実際のPostScriptコメントはMysticalレンダラが見る前に消えるため、
mystify.pyがコメントを検出可能なコード列に変換する - たとえば
% Show a standard message, centered horizontallyのようなコメントは次の形に変換される(Show a standard message, centered horizontally) /mystical_comment_flag pop pop
- レンダラはこのパターンを検出してMysticalコメントとして表示できる
サンプルアルゴリズム
- ページ上部の図は Quicksort の例である
- EuclidのGCDアルゴリズムの例も含まれている
- この例ではdmmlibの
/arg {exch def} def関数を使っている
- この例ではdmmlibの
Mystical画像生成関数
- すべての関数は
mystical.psに定義されている mystical- 配列、実行配列、辞書を受け取り、Mystical形式でレンダリングする
- 必要に応じて下位構造まで降りて描画する
- 画像全体は 単位円 に合わせてスケーリングされる
mystical_evokemysticalと同じだが、現在の辞書から参照する名前を入力として受け取る
mystical_evoke_labelmystical_evokeに似ているが、上部に名前・定義の結合表記を追加する- 名前シジルが正立して見えるように画像を回転する
- 3つの関数にはすべて
_unscaledが付いた版がある- これらの版はスケーリング工程を省く
- リングの厚さが1単位のため、画像はかなり大きくなる
- 使い方は Mystical usage notes にある
Mystical画像生成プログラム
- 現在提供されているプログラムは、Pythonスクリプト
mystify.pyひとつである mystify.pyは2つの作業を行う- PostScriptプログラム全体をMysticalプログラムとして描くコードで包み、8.5x11ページ中央に 幅8インチ で配置する
%で始まるPostScriptコメント行をMysticalコメントに変換する
- ファイル先頭のコメントは変換しない
- 例:
%!PS
- 例:
- インデントが同じ隣接コメント行は、改行を含む1つの長いコメントとして扱われる
-
レイアウト制約
- 現在のコードは、下位の円同士が衝突しないようにレイアウトを計算する
- 計算が過度に保守的なため、多くのプログラムが非常に広く拡散して見えることがある
- ページの例は、パース・レイアウト関数
mystical_get_spell、mystical_make_evocation_ligatureを実行した後に結果を調整し、draw_sigil、draw_linkを呼び出して作られている - 既定レイアウトは改善予定である
言語と見なせるか
- 現在のMysticalは、PostScriptプログラムを描く方法である
- Mystical画像を入力として適切な計算を行う インタプリタは存在しない
- 人間がMystical画像を読んで実行することもできるし、より現実的には、人間がそれをPostScriptプログラムに変換してから実行できる
他言語への適用可能性
- このアプローチは、Forthのような 演算子だけの言語 にも適用できそうである
- より複雑な文構造を持つ言語には適用が難しいかもしれない
- 波括弧やインデントごとに新しいリングを作ると過度に複雑になるかどうかは不明である
まだコメントはありません。