API
セレクタの一覧は、コンパイラが持つ型シグネチャの表に沿っています。この表に無いセレクタはコンパイルエラーになります。完全な一覧は配布物に同梱の lpsc api の出力にあります。このページは主なものの概要です。
数値
| 型 | 主なセレクタ |
|---|---|
Int | + - * / // \\ rem: < abs negated squared sqrt even odd isZero max: min: between:and: grouped asDecimal asFloat asString to: to:do: to:by:do: to:collect: timesRepeat: |
Float | Int と同じ算術。sqrt floor ceiling rounded asInteger |
Decimal | + - * と比較。丸め: roundedTo: truncatedTo: floorTo: ceilingTo: awayFromZeroTo:。除算と丸め: dividedBy:roundedTo: ほか四つ。scale rounded truncated abs negated isZero asFloat。表示: grouped groupedTo: |
Int は BigInt です。Int の / は Float を返します。整数の商と余りは // と \\ です。
Decimal に / はありません。割るときは dividedBy:roundedTo: ほか四つを使います。結果の桁数を引数に取るので、どこで丸めたかがコードに残ります。
Arithmetic(+ - *)は Int Float Decimal が、Numeric(/ \\)は Int と Float が名乗ります。どれでも通るメソッドは、型の名前ではなくプロトコルの付いた値を取ります。
文字列
| 型 | 主なセレクタ |
|---|---|
Str | , size isEmpty notEmpty at: copyFrom:to: splitOn: replaceAll:with: startsWith: endsWith: includesSubstring: indexOf: indexOf:from: indexWhere: indexWhere:from: asUppercase asLowercase reversed trimmed urlEncoded asInteger asDecimal asTime asSymbol collect: do: inject:into: と比較。クラス側に Str streamContents: |
Char | value code isDigit isLetter isAlphanumeric |
Symbol | name |
Bool | and: or: not ifTrue:ifFalse: |
WriteStream | << nextPut: nextPutAll: print: nl space tab contents position reset。生成: WriteStream new WriteStream on: |
asInteger asDecimal asTime は Maybe を返します。変換できない文字列は none です。'1,000' も '26:30' も none になります。日付とタイムスタンプを読むのは Date parse: DateTime parse: Instant parse: で、こちらは none ではなくエラーにします。
人が入力した文字列には asEnteredInteger asEnteredDecimal asEnteredDate asEnteredTime asEnteredDateTime を使います。全角数字、桁区切りのコンマ、斜線区切りの日付、9:05 のような時刻を正規化してから読み、Maybe を返します。12x は none、2026/2/30 も none です。
WriteStream は文字列を少しずつ組み立てます。Str streamContents: はブロックにストリームを渡し、そこへ書かれたものを返します。<< は値を人が読む形で書き、print: はプログラマが読む形で書きます。
値の書き出し方は二つ
printString printNl print はプログラマが読む形、displayString displayNl display は人が読む形です。違うのは Str Char Symbol の三つだけで、それ以外の値では同じになります。asString は人が読む形です。
'it''s' printNl. "'it''s'"
'it''s' displayNl. "it's"
$a printNl. "$a"
#name displayNl. "name"
入れ物・Maybe・レコードの中身は、どちらの形でもプログラマが読む形で書きます。だから #('two') と #(#two) が読み分けられます。
#('a' 'b') displayNl. "#('a' 'b')"
(Maybe some: 'x') displayNl. "some('x')"
クラスが自分の書き方を持つには、printString か displayString を答えます。入れ物の中でもその形で書かれます。printString だけを答えるクラスは、人に見せるときもその形になります。
Object subclass: #Money fields: (yen : Int).
Money >> printString = '¥' , yen asString.
#[ Money fields: { yen: 1 } ] displayNl. "#(¥1)"
プログラムの出力は displayNl です。配布物の例は全部これを使っています。
正規表現
| 型 | 主なセレクタ |
|---|---|
Regex | matches: match: search: searchAll: findAll: split: replaceAll:with: replaceAll:using:。生成: Regex compile: Regex compileIgnoringCase: |
RegexMatch | text group: named: start end |
調べる文字列は引数に渡します。受け手ではありません。match: は Maybe[Str]、search: は Maybe[RegexMatch]、searchAll: は一致を全部順に返します。
r := Regex compile: '([a-z]+)@([a-z.]+)'.
(r search: 'mail a@b.c here') ifPresent: [:m |
m text displayNl. "a@b.c"
(m group: 1) displayNl. "some('a')"
m start displayNl ].
group: 0 は一致全体です。一致に加わらなかったグループは none、パターンに無いグループはエラーです。named: は名前付きのグループを読みます。replaceAll:using: は一致ごとに RegexMatch をブロックへ渡すので、一致した中身から置換後の文字列を組み立てられます。replaceAll:with: が取るのは普通の文字列で、その中の $1 は後方参照ではなく二文字です。compileIgnoringCase: は JavaScript の i フラグです。
Regex は値で、フィールドの型として書けます。ただし別のアクタへは渡せません。組んだパターンは、それを組んだエンジンのものだからです。
コレクション
| 型 | 主なセレクタ |
|---|---|
Array[a] | size isEmpty notEmpty first last at: at:ifAbsent: do: doWithIndex: collect: collectWithIndex: select: reject: detect:ifNone: inject:into: includes: indexOf: copyWith: take: drop: reversed sorted sortBy: distinct allSatisfy: anySatisfy: , |
Dict[k v] | at: at:ifAbsent: at:put: removeKey: includesKey: keys values associations size isEmpty notEmpty collect: select: do: keysAndValuesDo: |
Assoc[k v] | key value。生成: Assoc key:value: |
Maybe[a] | isPresent isAbsent value orElse: map: ifPresent: ifPresent:ifAbsent:。生成: Maybe some: Maybe none |
Array も Dict も不変です。at:put: は新しい Dict を返し、copyWith: は要素を一つ足した新しい Array を返します。sorted は < を送って並べるので、要素が < に答える型なら使えます。それ以外は sortBy: で順序を指定します。
sum max joinWith: flatCollect: などは Array の組み込みではありません。コンパイラに付いてくる Enumerable プロトコルのもので、Array と Str がこれを名乗っています。使うには imports: (Enumerable). と書きます。
imports: (Enumerable, Comparable).
#(3 1 2) sum displayNl.
自分のクラスでも、inject:into: を一つ書いて Enumerable を名乗れば、同じ一式が使えます。Comparable も同じで、< を書けば > <= >= min: max: が付きます。
日付と時刻
| 型 | 主なセレクタ |
|---|---|
Date | year month day dayOfWeek dayOfYear addDays: addMonths: addYears: daysSince: startOfMonth endOfMonth isLeapYear asDateTime isoString formattedAs: min: max: と比較。生成: Date today Date todayIn: Date y:m:d: Date parse: |
Time | hour minute second secondsFromMidnight formattedAs: と比較。生成: Time hour:minute: Time hour:minute:second: Time fromSeconds: |
DateTime | year month day hour minute second millisecond date time asInstantIn: asInstantOffset: asLocalInstant isoString formattedAs: と比較。生成: DateTime y:m:d:h:min:s: DateTime y:m:d:h:min:s:ms: DateTime now DateTime parse: DateTime fromMs: |
Instant | asMs addMs: msSince: asDateTimeIn: asDateTimeOffset: asLocalDateTime dateIn: isoString isoStringIn: isoStringOffset: min: max: と比較。生成: Instant now Instant fromMs: Instant parse:。ほかに Instant localOffset と Instant offsetOf: |
TimeZone | name offsetAt:。生成: TimeZone named: TimeZone utc TimeZone local。ほかに TimeZone names と TimeZone databaseVersion |
Date DateTime Instant TimeZone は名前ごと Lambda Prelude のものです。Time だけがこの言語のものです。
Date は 1970-01-01 からの日数で、タイムスタンプには一切触りません。だから取り違えるタイムゾーンがありません。Date y:m:d: と Date parse: は、暦に無い日を渡すとエラーです。
月末は丸めます。業務のコードで最も多い日付の不具合がこれです。
(Date y: 2026 m: 1 d: 31) addMonths: 1 "2026-02-28"
Time は 0 時からの秒数なので、24:00 も負の時刻もありません。addMinutes: はありません。23:45 の三十分後が翌日なのか入力誤りなのか、時刻だけでは判断できないためです。計算は secondsFromMidnight で秒にし、Time fromSeconds: で戻します。範囲外の値は、巻き戻さずにエラーにします。
DateTime はタイムゾーンを持たない暦の読み取りで、年からミリ秒まで持ちます。時点ではありません。2026-03-08 02:30 は、場所によって二回あったり一度も無かったりします。絶対なのは Instant の方で、エポックからのミリ秒です。計算は addMs: と msSince:、isoString は UTC の RFC 3339 です。
この二つを行き来するときはタイムゾーンを指定します。指定の形は三つで、TimeZone、UTC から東へ何秒か(分単位、一日未満)、実行環境のタイムゾーンです。
ny := TimeZone named: 'America/New_York'.
dt asInstantIn: ny.
dt asInstantOffset: 32400. "+09:00"
dt asLocalInstant. "実行環境のタイムゾーン"
i asDateTimeIn: ny.
i asDateTimeOffset: 32400.
i asLocalDateTime.
i dateIn: ny. "その土地では何日か"
i isoStringIn: ny. "そのタイムゾーンのオフセットで RFC 3339"
Date todayIn: ny.
Instant localOffset. "実行環境の今のオフセット。秒"
オフセットは数が一つだけで、それ以上のことを知りません。TimeZone は IANA の名前で指すタイムゾーンで、その土地の時差の移り変わりを知っています。答えが日付によって変わる場合は、こちらを使います。
(ny offsetAt: (Instant parse: '2026-07-01T00:00:00Z')) displayNl. "-14400"
(ny offsetAt: (Instant parse: '2026-01-01T00:00:00Z')) displayNl. "-18000"
夏時間の切り替えで飛ばされた時刻はその分だけ後ろへずれ、二度ある時刻は早い方の瞬間になります。Java の ZonedDateTime.of と同じ読み方です。
((DateTime y: 2026 m: 3 d: 8 h: 2 min: 30 s: 0) asInstantIn: ny) isoString.
"2026-03-08T07:30:00.000Z —— 02:30 は存在しないので 03:30 EDT"
((DateTime y: 2026 m: 11 d: 1 h: 1 min: 30 s: 0) asInstantIn: ny) isoString.
"2026-11-01T05:30:00.000Z —— 01:30 は二度あるので早い方"
データベースは同梱しません。実行環境の Intl を使います。ブラウザも Node も持っているものです。どの版かは TimeZone databaseVersion が答えます。Node は tzdata の版を答え、ブラウザは空の文字列を返します。実行環境が持っている名前の一覧は TimeZone names です。無い名前はエラーで、大文字小文字だけが違う名前もエラーです。
TimeZone named: no time zone is named asia/tokyo
TimeZone は名前で等しさを比べる値です。JSON には名前で書かれ、Worker へも送れます。JavaScript の境界には書けません。向こうに対応する形が無いためです。
Date parse: が読むのは yyyy-MM-dd だけ、DateTime parse: はそれに続けて T か空白の後の時刻を読みます。どちらも読めなければエラーで、DateTime parse: はタイムゾーンを書いた文字列を受け付けません。タイムゾーンを読むのは Instant parse: の方で、Z +09:00 +0900 +09 を読み、オフセットの無い文字列は受け付けません。サーバから来るタイムスタンプはオフセットを持っていて、DateTime は壁の時計の読み取りだからです。Instant offsetOf: は、その文字列が書かれたオフセットを返します。Instant 自身はそれを持ちません。
asString が返すのは、通信に載せる一つの形だけです。それ以外の表示は formattedAs: で作ります。yyyy MM dd HH mm ss SSS を左から順に置き換え、それ以外の文字はそのまま出るので、日本語の形にエスケープは要りません。
dt formattedAs: 'MM月dd日 HH:mm'
Date は 0 時として扱い、Time は日付を持ちません。受け手が答えられない文字は、0 にはならず文字のまま残ります。
JSON と HTTP
| 型 | 主なセレクタ |
|---|---|
Json | at: at:put: itemAt: keys size isNull asStr asInt asDecimal asFloat asBool asArray asText |
Json(クラス側) | parse: object: array: str: int: decimal: bool: null |
Http | get: get:headers: post:json: post:json:headers: post:text: post:bytes:type: post:file:named:type: put:json: delete: url:query: encode: deadline: answerWith: answerLater: reply:json: reply:text: noAnswer: |
Response | status body bytes json ok reason header: headerNames |
Request | method url body header: |
at: は例外を投げません。オブジェクトでない値に送ると null の Json を返します。asInt などの型変換は Maybe を返します。
Http の要求は例外を投げません。接続できない場合は status 0 の Response を返し、reason に理由が入ります。
at:put: は指定したキーだけを差し替え、他のキーは保持します。画面が扱わない項目を含む JSON を、そのままサーバへ返せます。
Http answerWith: は、Request を受け取って Response を返すブロックを取ります。Response は reply:json: reply:text: noAnswer: で作ります。これで、サーバを立てずに画面を検査できます。返事をブロックで決め、App click: で押し、App htmlAt: で読むので、JavaScript は要りません。answerLater: はブロックが Future[Response] を返す形で、画面が待っている間の状態を検査するときに使います。
ファイル
| 型 | 主なセレクタ |
|---|---|
Bytes | size asText asTextIn: asCodes。生成: Bytes empty Bytes ofText: Bytes ofCodes: |
Base64 | encode: decode: encodeUrl: decodeUrl: |
ファイルはイベントで受け取ります。on: #change sendFileText: Loaded と書くと、ファイルの読み込みが始まり、読み終わったときに Loaded メッセージが届きます。載っているのは名前、type、内容の三つです。type はブラウザの File.type で、ブラウザが知らなければ空です。形が三つ埋めるので、フィールドが二つのメッセージクラスを渡すとコンパイルエラーです。
send の後に書くのは必ずメッセージのクラスで、Symbol を書くとコンパイルエラーです。文字列として読まないファイルには sendFileBytes: を使います。ファイル選択、貼り付け(#paste)、ドラッグ&ドロップ(#drop)は同じハンドラで受け取れます。
sendFileText:ifUnreadable: と sendFileBytes:ifUnreadable: は二つ目のメッセージクラスを取ります。フィールドは理由の Str 一つで、読み込みが失敗したときと、イベントがファイルを持っていると言っているのに届かなかったときに送られます。文字列の貼り付けでは何も送りません。付けていない場合、失敗はコンソールに出ます。on: at:on: me listen:on: の三つともこの形を持っています。
ファイルを渡すには App save: 'orders.csv' type: 'text/csv' text: s または save:type:bytes: を使います。
asText は UTF-8 として読みます。他の文字コードは asTextIn: 'ISO-2022-JP' のように名前で指定します。読める文字コードはブラウザと Node の TextDecoder に依存します(ISO-2022-JP、Shift_JIS、EUC-JP は両方で使えます)。Base64 decode: と asTextIn: は Maybe を返します。外部から来る文字列で例外を出さないためです。
Bytes ofCodes: と asCodes で、整数の配列とバイト列を相互に変換できます。base64 以外のエンコード方式(quoted-printable など)のデコーダは、これを使って LPScript で書けます。0 から 255 の範囲外の値はエラーです。UTF-8 以外の文字コードへの変換はありません。ブラウザの TextEncoder が UTF-8 しか出力しないためです。
Bytes は Worker へ渡せます。
画面
| 型 | 主なセレクタ |
|---|---|
Html | clone: clone:fill: el: el:text: el:attrs: el:kids: el:attrs:kids: text: markup: child: child:as: all: |
VNode | at:put: at:kids: at:class: at:attr:is: on:send: on:send:with: on:sendValue: on:sendEvent: on:sendFileText: on:sendFileBytes: on:sendFileText:ifUnreadable: on:sendFileBytes:ifUnreadable: at:on:send: key: class: addClass: removeClass: at:addClass: at:removeClass: attr:is: preventDefault preventDefaultOn: preventDefaultOn:keys: preventDefaultAt:on: stopPropagation stopPropagationOn: |
Event | kind value checked key x y scrollTop height shift ctrl alt meta |
App | mount: mount:at: hydrate:at: page: document path go: replace: open: save:type:text: save:type:bytes: html: htmlAt: highlight: |
App にはテスト用のセレクタもあります。click: type:text: press:key: check:is: focus: blur scrollTo: selectAll: です。
App document はページ全体を文字列で返します。サーバで描くときに使います。App hydrate:at: は、ブラウザで既にある領域を描き直さずに引き取ります。
go: と replace: は、走っているプログラムのアドレスを書き換えるだけで、次のページは読み込みません。読み込むのは open: です。ブラウザが無いときは、開こうとしたパスを記録します。
on: で始まるセレクタに渡すのはメッセージクラスです。型は、埋めるフィールドが無いときは Message、イベントがフィールドを埋めるときは Message[T] です。クラスはコンパイル時に受け手のアクタのハンドラと照合され、運ぶ値はメッセージクラスのフィールドの型と照合されます。共通部品がメッセージクラスを受け取って送信する場合も同様です。
at: '.cred' class: 'sec off' は .cred で選んだノードの class を sec off に置き換えます。置き換え後は .cred で探せなくなります。addClass: と removeClass: は class を一つだけ追加または削除し、他の class は保持します。
preventDefaultOn: #drop は指定したイベントの既定動作だけを止めます。同じノードの #paste には影響しません。preventDefaultOn: #keydown keys: #('ArrowUp' 'ArrowDown' 'Enter' 'Escape') は指定したキーの既定動作だけを止め、他のキーの入力は通します。この指定は状態に応じて変えられます。
checked disabled readonly required selected の属性値は真偽として解釈します。'' 'false' '0' 'no' 'off' は偽で属性を付けず、それ以外は真です。
アクタ
| 型 | 主なセレクタ |
|---|---|
Actor(クラス側) | spawn: spawn:named: |
ActorRef[c] | ! ask: name isAlive |
ActorCtx[c](me) | ref name spawn: monitor: linkTo: trapExits: stop stop: after:send: onPath: listen:on:send: listen:on:sendValue: listen:on:sendEvent: listen:on:sendFileText: listen:on:sendFileText:ifUnreadable: intercept:on:send: ほか |
Down | actor reason |
Exit | actor reason |
Future[a] | forced then: map: onError: resolve: fail: pending? resolved? |
Future(クラス側) | new value: all: after:do: sleep: |
Worker(クラス側) | new spawn:on: |
! と ask: はメッセージを受け取り、そのクラスでどのハンドラに届くかが決まります。! は参照を返すので送信を続けて書けます。ask: は Future を返し、forced で返事を待ちます。受け手のアクタにそのメッセージのハンドラが無ければコンパイルエラーです。参照のクラスが決まらないとき —— 子が owner : ActorRef[a] で親を持つ場合など —— は照合するハンドラの表が無いので、その送信は実行時に解決されます。
me monitor: ref と書くと、そのアクタが止まったときに Down メッセージが届きます。me linkTo: ref にすると相手が止まったとき自分も止まり、me trapExits: true を指定してあれば止まる代わりに Exit メッセージが届きます。
isAlive は Maybe[Bool] を返します。同じスレッドのアクタは生死が分かります。別スレッドのアクタは分からないので none です。別スレッドのアクタの生死は monitor: で通知を受けます。
Future new は、まだ何も決まっていない Future を作ります。resolve: と fail: で結果を入れ、pending? と resolved? でどちらかを調べます。Promise を返さない API を包むときに使います。
値とクラス
すべての値が printString printNl print printOn: displayString displayNl display asString asJson asObject className isKindOf: isMemberOf: = ~= に答えます。
何かをするだけの送信は、受け手を返します。だから続けて書けますし、ハンドラは返す状態を自分で書くことになります。me monitor: ref は me、App go: は App、whileTrue: は条件のブロック、ifPresent: は受け手を返します。片側だけの ifTrue: と ifFalse: は、ブロックが動いたかどうかに関わらず受け手の Bool を返します。Unit が残っているのは、何も返さないと宣言した JavaScript の関数と、返事をしないハンドラの返事だけです。
自分で宣言したクラスの値は、さらに copyWith: atField: atField:put: atField:putJson: withJson: withJson:keyedBy: withJson:keys: に答えます。atField: はフィールドを名前で読み、Object を返します。書き込みは atField:put: と atField:putJson: です。withJson: は Json のオブジェクトからフィールド名で照合して埋めます。withJson:keyedBy: は綴りが規則で決まるときにブロックを取り、withJson:keys: は綴りの違うフィールドだけを並べます。クラスに無いキーは無視し、キーが無いフィールドは元の値のまま残ります。読み方はフィールドの型が決めます。Int のフィールドは JSON の文字列 "120" を読み、Bool のフィールドは 0 と 1 を読みます。真偽値の列を持たないデータベースの前に立つ API がそう答えるためです。
クラス自身は fields: fieldNames name protocols に答えます。自動で用意される生成子は fields: だけです。new を含め、それより短い作り方はクラス側のメソッドとして自分で書きます。
アクタのクラスはさらに become: reply: reply:with: に答えます。ハンドラが返すものです。
System allClasses はプログラムのクラスを全部 Array[Object] で返します。name と protocols と合わせて、実装を名前から引くのはこれで書きます。
System allClasses select: [:c | c protocols includes: 'Validator']その他
Console(print: printLine:)、Math(pi sqrt:)、Error(raise: try:onError:)、Block(value value: ensure: whileTrue:)があります。
一覧の検証
型が何に答えるかは、コンパイラの型シグネチャの表で決まります。表に無いセレクタはコンパイルエラーです。表にあるセレクタがランタイムに実装されているかは、自動テストで照合しています。