実行とビルド

書いている間はすぐ動かし、配るときはネイティブに

lp9 run   orders.lp9                    書いている間。すぐ動く
lp9 build orders.lp9 --out orders.exe   配るとき。ネイティブの実行ファイルを作る

lp9 run は、書いたプログラムをその場で動かします。ビルドを待つ必要がありません。lp9 build は、配るためのネイティブの実行ファイルを作ります(ビルドには Zig のツールチェインを使います)。

二つは同じ答えを出します。 意味を決めるのはビルドした実行ファイルの方で、解釈器はそれに合わせています。同梱の検査のうち、成功すべきプログラム 143 本は全部を両方で実行し、出力を一バイトずつ比べています。断られるべきプログラム 104 本は、断られ方の文面まで記録してあります。開発中に run で確かめたことが、配った実行ファイルでも成り立ちます。

違うのは速さと、深い再帰がどこで止まるかだけです。解釈器の方が浅い所で止まりますが、止まり方の文面は同じです。

ビルドした実行ファイルには、配列の添字の範囲などの検査が残ります。範囲の外を読んだプログラムは、黙って別の値を読む代わりに止まります。

配る形

実行ファイルが一つ。 利用者の機械に言語のランタイムを入れる必要はありません。Windows では SDL3 の DLL を横に置きます。Linux ではディストリビューションの SDL3 を使います。

使うものだけが入ります。 lp9 build は、プログラムが使うと型推論で分かったライブラリだけをリンクします。SQLite を使わないプログラムに SQLite は入りません。

画面のあるプログラムは、ウィンドウのアプリになります。 Windows でエクスプローラやタスクバーから起動しても、コンソールの窓は開きません。画面の無いプログラムはコンソールのプログラムのままです。

アイコンは実行ファイルに入ります。 画面のクラスが class >> icon で .ico か .png を指すと、ビルドのときに読んで埋め込みます。

いくつかの道具を一つにまとめられます。

lp9 bundle --out tools.exe import.lp9 export.lp9 check.lp9
tools import

それぞれのプログラムは別の名前空間に入り、最初の引数でどれを動かすかを選びます。

ウィンドウを開かずに画面を確かめる

画面のプログラムには、操作を引数で渡せます。描いた一コマは PNG に書き出されます。lp9 run にもビルドした実行ファイルにも使えます。

lp9 run orders.lp9 --click 120,40 --text 受注伝票 --key Return --shot out.png
--shot out.png一コマを PNG に描いて終わる
--click x,yそこを押す。a|b|... と並べると順に押す
--key k|k、--text sキーを押す、文字を確定する
--preedit s、--cands a|b日本語入力の途中の状態
--drag dx,dy、--wheel Nドラッグ、ホイール
--files x,y=a|bファイルをそこに落とす
--file-dialog pathファイルダイアログで選んだことにするパス
--size w,hウィンドウの大きさ
--frames NN コマ進めてから描く

--shot の間は時計が止まり、--frames が一コマを六十分の一秒として進めます。動き続ける画面でも、いつ撮っても同じ絵になります。run と build も同じ絵を描きます。

人が画面を操作しなくても、画面の振る舞いを自動の検査に入れられます。LP-9 自身も、29 本の画面をこの形で検査しています。このサイトの画像も、全部この方法で撮ったものです。

止まったとき

ウィンドウのアプリをエクスプローラから起動したときは、標準エラーがありません。そのため、実行時のエラーはメッセージボックスで知らせます。

Windows でアクセス違反やスタックの溢れが起きたときは、どこで起きたかを書いてから終わります。