データと外の世界
どれも最初から入っていて、imports: は要りません。lp9 build は、型推論が使うと決めたライブラリだけをリンクします。
名前と答えは Lambda Prelude に合わせています。違うのは、他人が書いたものを読む所の多くが、止まる代わりに Maybe を返すことです。
ファイルとプロセス
File read:、File write:contents:、File append:contents:、File listDir: など。読めない・書けないパスはプログラムを止めます。
File open: は、読み書きのために開いたままのファイル(FileHandle)を返します。追記だけのログに要るものが揃っています。
- 位置を持ちません。
readAt:size:は読む場所を言い、append:は末尾を探して書きます。読んでも次に書く場所は動きません。 tryLockはファイル全体の排他ロックを待たずに取り、取れなければ false を返します。ensure:で閉じます。
子プロセスは 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:。
- IPv6 と IPv4 の両方。接続は Happy Eyeballs(RFC 8305)の順で試します。
- TLS は 1.2 と 1.3 のクライアントで、証明書は OS の証明書ストアで検査します。
- HTTP は接続、ハンドシェイク、読み込みの全部で一つの締め切り(既定 30 秒)を使います。本文の上限は既定 16 MiB です。
- 通信は呼んだ所で待ちます。その間、同じ domain の他のアクタも待つので、画面を止めたくなければ通信するアクタをワーカーの domain に置きます。
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 で扱います。
文字列の道具
Regexは Perl の書き方で、OCaml のreと同じ答えを返します。後方参照と先読みは無く、照合は文字列の長さに比例する時間で終わります。Hashはsha256:、sha512:、hmacSha256:key:、crc32:。Base64は標準と URL 安全の二種類。読めないものはMaybeで返します。Zlibは zlib のストリームを書いて読みます。
クリップボードと画像
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 で、ミリ秒の三桁を常に付けます。文字列の並びが時刻の並びと同じになります。