デモ
LP-9 と一緒に配っている画面です。業務の表と入力、子ウィンドウ、監視盤、地図の上を動くもの。どれも LP-9 だけで書いてあり、ほかのライブラリは使っていません。
このページの画像は、どれもウィンドウを開かずに LP-9 自身が描いた一コマです。
配布物には、このほかに言語の機能を一つずつ見せる小さなプログラムが入っています(このページの最後にあります)。
羽田空港
北風運用。34L と 34R に着陸し、34R と 05 から離陸する
滑走路 4 本、誘導路 750 本、エプロン、ターミナル、東京湾の岸。絵ではなく、OpenStreetMap の形をデシメートル単位の線と面で描いています。拡大と移動は掛け算と割り算だけなので、どこまで寄っても線はぼやけません。
機体はそれぞれアクタで、自分の位置を知っているのは自分だけです。 誘導路から割り出した経路に沿って地上を走り、停止位置で管制に滑走路を頼みます。空港の中で共有できないのは滑走路だけだからです。使用中の滑走路を横切る所でももう一度頼み、着陸機も進入を始める前に頼みます。三つのどこかに列ができるのは、その答えのメッセージがまだ返ってきていない、ということです。
左下の交信は、トラフィックそのものです。 一行一行が、あるアクタが別のアクタに送ったメッセージで、表示のために書いたものはありません。
最初は一コマに 7,392 個の部品を描いていました。空の部品が親の大きさをウィンドウの左上まで引き延ばし、描き直す矩形が画面全体になっていたためです。それと、群を矩形で飛ばしていなかったことを直して、一コマに描く部品は 427 個になりました。誘導路 750 本は、比較一回で飛ばせます。
世界の航空機
1,200 機。どの機体も自分の間隔で動くアクタ
海岸線は Natural Earth の 5,128 点をメルカトル図法に投影し、整数で書いたものです。地図は Paint line: で引いた線で、機体も胴体・主翼・尾翼の三本の線です。拡大と移動は掛け算と割り算だけで、Float は一つも使っていません。
1,200 機はそれぞれアクタで、二つの空港の間を自分の間隔で飛びます。他の機体のこともウィンドウのことも知りません。地図がどこを見ているかを教えられ、画面の上の自分の位置を出し、記述を返すだけです。動かなかった機体の領域は前のコマと同じ記述なので、ランタイムはその画素に触りません。
監視盤
283 のアクタ。赤いのは範囲を外れた計器
280 個の計器がそれぞれアクタで、自分の間隔、自分の動き方、自分の範囲を持ちます。全体を一斉に動かす時計も、一覧を掃く処理もありません。ゲームの逆で、一コマに変わるのは数個、残りは前のコマと同じ記述を返します。
一コマに描いた部品の数の中央値は 16 でした。十一個が動いたコマで描くのは、十一個の小さな矩形で、二百八十個ではありません。
画面でできること
左の一覧で頁を選ぶ。これは市況の頁
画面の全部入りです。左に頁の一覧、右に選んだ頁。市況、監視、ボタン、入力、文字、選択、一覧、進捗、日付、重なり、図形、配色の頁があり、どれも Paint を返すメソッド一つです。頁を足すのは、一覧に名前を一つ書いてメソッドを一つ書くことです。
市況の頁では、銘柄ごとのアクタが自分の間隔で値を出し、それを集める一つのアクタからテープ、値上がりの順位、業種の平均に配られます。どれもスレッドも時計も書いていません。OS sleep: で止まったターンの間、domain は他のアクタを動かしています。
受注一覧
列は一度だけ定義する。見出しもセルも並べ替えも同じ定義を読む
表の列は値です。題、幅、右寄せかどうかを持ち、見出し、各行のセル、並べ替えが同じ列を読みます。行はアクタで自分の領域を持つので、変わらなかった行は前のコマと同じ記述です。見出しはスクロールする箱の外にあるので、行がその下を流れても残ります。
数量は打ち込めます。打ち込んだ数量は行のアクタが持っているので、並べ替えと保存は行に尋ねます。読み込んだときの値ではなく、いま表示している値で並び、保存されます。金額は Decimal です。
子ウィンドウ
タイトルバーで動かし、押せば前に出て、右下で大きさが変わる
一つのウィンドウの中の子ウィンドウです。それぞれがアクタで自分の領域を持ちます。重なりの順は、子ウィンドウを並べた Array そのものです。Paint group: は後ろのものを上に描き、押下は後ろから探すので、一番上のものが答えます。前に出すのは、配列の最後に移すことです。
確認のダイアログは Paint modal: で浮かせます。出ている間は、外れた押下はどこにも届きません。
小さなプログラム
言語の機能を一つずつ見せるプログラムが、番号順に並んでいます。
- 言語 — 値、数、文字列、ブロック、コレクション、
Maybe、クラス、推論、プロトコル、日付、失敗、モジュール - アクタ —
tellとask、become、選択受信、監視、domain - 外とのやりとり — ファイルと OS、JSON、SQLite、二方向 SQL、TCP
- 画面 — ウィンドウ、領域、ウィジェット、レイアウト、イベント、日本語入力、ツリー、日付の選択、常駐
- 断られる例 — 型の不一致、知らないセレクタ、外へ書くブロック、曖昧なプロトコル、満たされないプロトコル、
becomeでの欠落、受け取られないメッセージ、待つ画面