データと外の世界

どれも最初から入っていて、imports: は要りません。lp9 build は、型推論が使うと決めたライブラリだけをリンクします。

名前と答えは Lambda Prelude に合わせています。違うのは、他人が書いたものを読む所の多くが、止まる代わりに Maybe を返すことです。

ファイルとプロセス

File read:、File write:contents:、File append:contents:、File listDir: など。読めない・書けないパスはプログラムを止めます。

File open: は、読み書きのために開いたままのファイル(FileHandle)を返します。追記だけのログに要るものが揃っています。

子プロセスは OS exec:(終わるまで待って終了コード・標準出力・標準エラーを返す)、OS spawn:(すぐ pid を返す)、OS running:、OS kill: です。Windows では子にコンソールの窓を出しません。

データベース

SQLite は組み込み、PostgreSQL と MariaDB・MySQL は LP-9 がそれぞれのプロトコルを自分で話します。横に置くライブラリはありません。三つとも同じセレクタに答えます。

db := DB open: 'orders.db'.
db exec: 'INSERT INTO orders (name, due, price) VALUES (:name, :due, :price)'
   with: { name: 'ステンレス丸棒', due: (Date y: 2026 m: 10 d: 28), price: 1840.00s }.

rows := db query: 'SELECT name, price FROM orders WHERE due <= :d' with: { d: Date today }.
rows do: [ :r | ((r at: 'name') orElse: '(null)') displayNl ].

引数は名前で渡します。 :name は接続ごとの書き方(SQLite の ?、PostgreSQL の $1)になり、値はそれぞれの型のまま結び付きます。文が使う名前を渡し忘れても、渡した名前を文が使っていなくてもエラーです。綴りを間違えたキーが黙って NULL になることはありません。

行の列は Maybe[Str] です。 SQL の NULL は無い値として読めます。

withTx: は、ブロックが答えれば COMMIT、失敗すれば ROLLBACK して失敗をそのまま外へ伝えます。SQLite でも PostgreSQL でも使えます。

PostgreSQL は SCRAM-SHA-256 で認証し、sslmode=require で証明書を検査します。MariaDB は mysql_native_password と MySQL 8 の caching_sha2_password に対応します。

二方向 SQL

SQL のコメントに指示を書く形の文です。そのままデータベースのツールで実行でき、render: が文と引数に変えます。言語は Doma のもので、Lambda Prelude の TORM を移したものです。

Object subclass: #Find fields: (ids, active).

sql := SqlTemplate parse: 'SELECT id FROM users WHERE id IN /*ids*/(1, 2)
/*%if active */ AND active = 1 /*%end*/'.

r := sql render: (Find fields: { ids: #[ 3, 4, 5 ], active: true }) dialect: 'postgres'.
r text displayNl.        "... IN ($1, $2, $3) AND active = 1"

(sql render: (Find fields: { ids: #[ 9 ], active: false }) dialect: 'sqlite') text displayNl.
                         "... IN (?)"

条件が全部外れた WHERE は、キーワードごと消えます。dao: はディレクトリの SQL ファイルからメソッドを作り、entity: は表とクラスを結び付けます。どちらも読み込みのときに展開され、テンプレートが読めなければプログラムは動き始めません。

通信

TCP connect:port:、TCP listen:、TLS wrapClient:host:、Http get:、Http post:body:contentType:。

JSON と MessagePack

Json parse: は Maybe[Json] を返します。JSON でない文字列で止まりません。Json は文書の一つのノードで、葉はプログラムが期待する型のメソッドで読みます。

(Json parse: '{"name": "Alice", "total": 1234.50}') ifPresent: [ :o |
    (o at: 'name') stringValue displayNl.
    (o at: 'total') asDecimal displayNl ].       "1234.50"

読んだ型が読んだ所に書いてあるので、そこから計算したものは全部検査されます。小数点のある数は asDecimal で正確な金額として読め、ファイルを往復しても桁は落ちません。Decimal は文字列として書き出します。

MsgPack parse: と MsgPack serialize: は同じ文書を MessagePack で扱います。

文字列の道具

クリップボードと画像

Clipboard text と Clipboard text: s。Clipboard image は、プログラムが置いた PNG か、無ければスクリーンショットのビットマップを読みます。

Image decode: は PNG を読んで Maybe[Image] を返し、png は PNG を書きます。Paint image:x:y:w:h: は画像を矩形に合わせて描き、大きさを変えた写しは一度だけ作って覚えておきます。画像は変わらない値なので、同じ画像を持つ記述は同じ部品で、変わらない領域は描き直されません。

日付と時刻

Date、DateTime、Instant、TimeZone は言語の設計にあります。データベースと JSON に渡すときは、Date は 2026-10-09、Instant は UTC の RFC 3339 で、ミリ秒の三桁を常に付けます。文字列の並びが時刻の並びと同じになります。