日本語 · English

糖衣定義 — 変換の名前付けとテンプレート(プレースホルダー)

分類: 束縛の一形(§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) 動的(評価のとき)

落とし穴

関連

with(premise 側の差し替え)・external(動的注入)・ filter(値式述語のラムダ=同じ矢印記法の値層側)・言語仕様 §4.8(糖衣定義)・ §3.5(束縛)・F110(循環検出の経緯)。