はじめに

必要なもの

コンパイラ本体だけです。Windows なら実行ファイル lpsc.exe と、隣に置くランタイムのディレクトリ。それと、書いた画面を開くブラウザ。

npm install はありません。プロジェクトに package.jsonnode_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は、出てくるコードと、言語が知らないブラウザの機能に届く方法です。

は、一緒に配られる画面の説明です。