糖衣定義 — 変換の名前付けとテンプレート(プレースホルダー)
分類: 束縛の一形(§4.8・専用構文なし) / 形: name(引数) = s => s |> core列(基底 B)・name = 段 |> 段(略記 A)
意味
ストリーム→ストリームの変換に名前を付けて再利用する機構。専用構文はなく、既存の = 束縛が
右辺の形で糖衣定義になる(糖衣性は依存解析で自動判定・core 語の再定義と定義の循環は静的エラー。
§4.8)。展開は右辺の機械的差し込み(core への片方向)で、展開は有限——だから再帰は書けない。
引数にはストリームも値も取れる。つまり糖衣定義は「作成済みの式に、あとからストリームや値を
食わせる」ためのプレースホルダーとして働く——n 日給料日のようなテンプレートを 1 度書き、
利用側が穴を埋める:
# eval: 2026-07-01..2026-11-01
@JP
paydayOf(n) = s => s |> within(month) |> nth(n) |> roll(Preceding, on: bizDay)
everyDay |> paydayOf(25)
#=> 2026-07-24 2026-08-25 2026-09-25 2026-10-23
7 月は 25 日が土曜なので前営業日 7/24 へ——「毎月 n 日・休日なら前営業日」の定義の形が
名前になり、25 は利用側の穴埋めである。
二つの使い方——パイプ段と適用
基底 B(ラムダ形)の糖衣は、パイプの段としても・関数適用としても使える。同じ変換の二記法で 外延は一致する:
# eval: 2026-01-01..2026-04-01
@JP
monthFirstBiz = s => s |> within(month) |> first
monthFirstBiz(bizDay) | (bizDay |> monthFirstBiz)
#=> 2026-01-02 2026-02-02 2026-03-02
(2026-01-01 は祝日なので月初営業日は 1/2。和 | が同一列に潰れる=二記法の
一致の実測。)
前段が素直なら s => を省くポイントフリー略記(略記 A・eta 簡約)も書ける:
# eval: 2026-01-01..2026-04-01
@JP
firstSunday = filter(d => weekday(d) == Sun) |> within(month) |> first
everyDay |> firstSunday
#=> 2026-01-04 2026-02-01 2026-03-01
プレースホルダーの三層(何をどこで差し込むか)
| 差し込むもの | 機構 | 時期 |
|---|---|---|
| ストリーム・値(式の引数) | 本ページの糖衣定義 | 静的(定義を書くとき) |
式の中の自由名(bizDay の中身など) |
premise の派生 with(同じ式文面を別 premise で評価) |
静的 |
| 実行時に決まるデータ(祝日表・実行起点) | external(供給契約つきの注入・ADR-46) |
動的(評価のとき) |
落とし穴
- 循環は静的エラー(§4.8 の依存解析)。自己再帰
f = s => f(s)・相互再帰・引数なし束縛の 循環x = y・y = xは、いずれも経路つきの静的エラーになる(f → g → f)。糖衣の展開は 有限の差し込みであり、再帰的定義は糖衣ではない。 - 略記 A はパイプ段専用。
monthFirst = within(month) |> firstはeveryDay |> monthFirstで使う——適用形monthFirst(everyDay)は書けない(先頭段が変換でなく名前解決に入り 「未解決の名前」エラーになる)。適用形も使いたければ基底 B(s =>つき)で書く。 - core 語の再定義は静的エラー(
filter = …等。§4.8)。 - 被覆主張(束縛後置の covering:)は引数なしの束縛にのみ付く——引数付き束縛(ラムダ値)に は付けられない(ADR-37)。
関連
with(premise 側の差し替え)・external(動的注入)・
filter(値式述語のラムダ=同じ矢印記法の値層側)・言語仕様 §4.8(糖衣定義)・
§3.5(束縛)・F110(循環検出の経緯)。