LPScript
ブラウザで動く画面を書くための、アクタを持つ関数型 Smalltalk
待ち行列から自分で取り出さない
メソッドがそのままメッセージハンドラで、ハンドラは次の状態を返します。継続を捕まえる場面がないので、fiber もジェネレータのトランポリンも要りません。待つ場面では JavaScript の await をそのまま使います。
描き直しの指定を書かない
どこを描き直すかを書く場所がありません。ハンドラが次の状態を返すので、変わったかどうかは比べれば分かります。memo も依存配列も購読も無く、再描画の速さのために書く行が一行もありません。
書いた小数がそのままの値
1234.50 は Decimal です。二進の浮動小数点ではありません。業務システムを書く言語が、既定で金額を間違えては困ります。除算は、割り切れなければエラーにします。丸めるときは、どこで丸めるかと切り上げか切り捨てかを書かせます。
マークアップはデザイナの HTML
一覧の行もダイアログも、デザイナが置いた見本を複製して使います。同じマークアップを別の言語で書き写したものはありません。ページにないセレクタを指すと、コンパイルエラーになります。
何を書く言語か
ブラウザで動く画面です。一覧、検索、明細、編集と保存、画面から画面への受け渡し、HTTP と WebSocket、そして毎フレーム描き直す画面。
仕組みはどれも同じです。 状態を持つのはアクタ、届くものはメッセージ、描くかどうかは状態が変わったかどうか。ボタンが押されても、通信の返事が来ても、フレームが来ても、書き方は変わりません。
一万行の一覧も、ブロック崩しも、canvas のシューティングも、この仕組みだけで書いてあります。ゲームのために足した機能は一つもありません。
業務データの扱いは既定で正しくしてあります。 金額は Decimal、日付は暦の日付、JSON は桁を落としません。そういう画面を書く機会が多いからで、他の画面を書けないという意味ではありません。
Actor subclass: #Counter fields: (count).
Counter class >> init: n = Counter fields: { count: n }.
Counter >> inc = self with: { count: count + 1 }.
Counter >> get = self reply: count.
c := Actor spawn: (Counter init: 0).
c tell inc.
(c ask get) forced printNl. "1"
Lambda Prelude の兄弟です。あちらは常駐サービスを書くための OCaml 5 製の言語で、LPScript はその出力先ではありません。受け継いだのは言語の形だけです。値は変化しない。継承ではなくプロトコルを組み合わせる。nil の代わりに Maybe を使う。ランタイムには共通のものがありません。
実行前に止まること
ハンドラのないメッセージは書けません。 Counter に increment が無ければ、c tell increment はコンパイルエラーです。ask の結果の型も、返事をするハンドラで決まります。
ページに無いセレクタも書けません。Html clone: '#lines tr' の '#lines tr' は、モジュールが宣言したページと突き合わせます。
become: で状態を切り替えたとき、その参照に約束した分を答えられなくなっていれば、そこで止まります。
ブロックをアクタの境界の外へ渡そうとしたときも止まります。ブロックは作られた場所を閉じ込めているので、複製できないからです。
金額と日付と JSON の読み方は一つ
1234.50 は Decimal です。割り切れない除算はエラーになり、丸めるときは位置と向きを書きます。
Date は暦の日付で、時刻も時間帯も持ちません。31日の一か月後は翌月の末日です。
JSON の数値は届いた文字のまま運ぶので、1234567890123456789.12 は往復しても同じ値です。
どこで動くか
ブラウザです。普通の ES モジュールとして動きます。一つの画面は一つの .lps と、そこから取り込む部品でできています。
組み立ては画面ごとです。223行の受注画面を検査したときは、かかった時間が 0.000 秒と出ました。時計の刻みより速かった、という意味です。
重い処理は Worker spawn:on: と書けば別のスレッドに移ります。参照には、そのアクタがどこで動くかが書かれていません。
ライセンスとお問い合わせ
LPScript は プロプライエタリソフトウェアであり、すべての権利は 合同会社 Lambda に帰属します。LPScript の複製・改変・再配布には、合同会社 Lambda による書面での事前許可が必須 です。OSS ではありません。
バイナリ(コンパイラ lpsc、言語サーバ、ランタイム、エディタ拡張)は 無償・無保証・現状有姿 (as-is) で提供します。評価・利用は すべてご自身の責任 で行ってください。特定用途への適合性は保証しません。別途契約しない限りサポートは提供せず、利用に起因する一切の損害について責任を負いません。
ソースコード は NDA を締結したパートナー企業にのみ開示します。この NDA および付随する個別契約が、ライセンス本文で要求される「書面での事前許可」にあたります。ソース開示は 有償案件(共同開発・カスタマイズ・統合)とセット であり、ソース単体での販売は行いません。
業務画面の開発や本番運用での LPScript 利用をご検討の場合は、お気軽にご相談ください。主に以下の 3 つの形態でご一緒します。
- 共同開発 — 業務画面そのものを貴社チームと共同で実装します。既存のバックエンドに合わせた画面、既存システムの画面の置き換えなど。
- カスタマイズ — 貴社の画面に合わせた共通部品、デザイナの HTML との突き合わせ方、運用環境に合わせた組み立て手順の調整。
- NDA ベースのソース開示 — 社内拡張・監査・長期保守のためのフルソースアクセス。
ご相談は 合同会社 Lambda までお寄せください。