はじめに
必要なもの
コンパイラ本体だけです。Windows なら実行ファイル lpsc.exe と、隣に置くランタイムのディレクトリ。それと、書いた画面を開くブラウザ。
npm install はありません。プロジェクトに package.json も node_modules も要りません。LPScript のプログラムが依存するのは、一緒に配られるランタイムだけです。
Node は、lpsc run でブラウザを使わずに走らせるときと、画面を配信する簡易サーバを動かすときに使います。18 以降が要ります。
編集には VS Code 用の拡張が付いています。診断、ホバー、定義へ移動、補完が使えます。中身は言語サーバへの薄い接続で、依存パッケージはありません。
入手について
バイナリは無償・現状有姿でお渡しします。 コンパイラ、言語サーバ、ランタイム、エディタ拡張の一式です。Windows では一つのディレクトリにまとまっています。評価は自由に行ってください。保証はありません。詳しくはトップの「ライセンスとお問い合わせ」に書いてあります。
LPScript はオープンソースではありません。ソースの開示は NDA を締結したパートナー企業に限られ、有償案件とセットです。
コンパイラ自体は OCaml で書いてあり、dune build で組みます。要るのは OCaml 5、dune、menhir だけで、これ以外のライブラリを使いません。ランタイムにも検査にも、依存パッケージが一つもありません。
コンパイラがすること
lpsc check orders.lps 構文解析と型検査だけ
lpsc emit orders.lps 入口モジュールの JavaScript を出す
lpsc build orders.lps モジュールごとに .mjs と .mjs.map を書く
lpsc run orders.lps 組んで、ソースマップ付きで走らせる
一つのファイルはプログラムの入口であって、全部ではありません。imports: が隣のモジュールを引き込み、まとめて検査します。出力はモジュール単位のままなので、.lps 一つが .mjs 一つになり、モジュールを跨ぐ参照は普通の ES import になります。
最初のプログラム
module Hello.
Object subclass: #Greeting fields: (who : Str).
Greeting class >> to: name = Greeting fields: { who: name }.
Greeting >> line = 'こんにちは、' , who , 'さん'.
(Greeting to: '東海精機') line printNl.
lpsc run で印字されます。値は変化しません。with: は新しい値を返します。
最初の画面
画面とは、デザイナが書いたページの一区画を持つアクタです。
<!-- index.html。この言語を知らない人が書いたもの -->
<div id="app">
<p class="count">0</p>
<button class="up">増やす</button>
</div>module Counter page: 'index.html'.
Actor subclass: #Screen fields: (n : Int).
Screen class >> new = Screen fields: { n: 0 }.
Screen >> up = self with: { n: n + 1 }.
Screen >> view = self reply: (
(Html clone: '#app' fill: { '.count' -> n asString })
at: '.up' on: #click send: #up).
App mount: Screen new at: '#app'.
page: は、この画面がどの文書のものかをコンパイラに伝えます。書いたセレクタは全部そのファイルと突き合わせます。HTML の .count を別の名前に変えれば、組み立てが止まります。黙って何も描かれない、ということにはなりません。
次に読むもの
アクタは、残り全部がそこから出てくる判断です。ハンドラが次の状態を返し、待ち行列がそれを据えます。
画面は、デザイナのマークアップを借りる仕組み、イベントをブロックではなく名前で書く理由、一万行の一覧にかかる費用です。
設計は、この言語が一つに決めた読み方です。金額、日付、JSON、そして型が約束することとしないこと。
JavaScriptは、出てくるコードと、言語が知らないブラウザの機能に届く方法です。
例は、一緒に配られる画面の説明です。