**構文の再考:隣接により束縛される**

2026/03/08 14:03

**構文の再考:隣接により束縛される**

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:


Summary

Binding Expressions は、リテラルと識別子の隣接を二項演算子として解釈する Java コンパイラプラグインです。型に

prefixBind
postfixBind
メソッドを定義することで、プラグインは左から右へ構造化された探索(経路が失敗したときのみ後退)で隣接ペアを解決し、暴力的なバックトラックではありません。

例としては次のようなものがあります:

  • 日付
    2025 July 19
    LocalDate
  • 単位
    299.8M m/s
    → 単位演算
  • 範囲
    1 to 10
    Range<Integer>
  • 自然言語イベント
    "Meet Alice Tuesday at 3pm"

これらのバインディングは型安全であり、Java コアクラスを変更することなくコンパイル時に解決されます。ロジックはすべて型自身の内部にあります。IntelliJ プラグインは入力中にライブフィードバックを提供し、式がどのようにバインドされるかを表示します。

制限事項:構文解析は複雑で認知負荷を増大させる可能性があります。また現在は区切り文字や句読点を扱いません。アプローチは実験的なものであり、将来的にはコンパイル時の検証(例:日付の妥当性)や区切り文字・句読点へのサポート、追加言語機能が加わる可能性があります。


この改訂された要約は、キーポイントリストからすべての主要なポイントを保持し、未確認の推論を除外しつつメッセージを明確かつ簡潔に保っています。

本文

「隣接が二項演算子だったら?」

2025 7月 19 → 

LocalDate

これが binding expressions(結合式) のコンセプトです。
Java用のコンパイラ・プラグインで、隣接している表現を 「二項演算子」とみなすとどうなるかを探るものです。 簡潔に言えば、隣接した式同士がその静的型に基づいて結合され、 新しい1つの式になるようにします。


型指向の式結合

binding expressions では「隣接」が構文トリガーとして使われます。
隣接している式は、各型が定義したメソッドを通じて解決されます。

Java(Manifold コンパイラプラグイン)での例

結果
2025 July 19
LocalDate
299.8M m/s
Velocity
1 to 10
Range<Integer>
Meet Alice Tuesday at 3pm
CalendarEvent

隣接した式のペアは「結合候補」となります。
左辺(LHS)の型が次を定義していれば:

<R> LR prefixBind(R right);

または右辺(RHS)が次を定義していれば:

<L> RL postfixBind(L left);

コンパイラは該当する結合メソッドを適用します。
これらの結合は入れ子になり、合成され、最終的には 1つの型安全な式へと還元されます。


例:LocalDate を可組み立て式に

LocalDate date = 2025 July 19;

コンパイラは隣接ペアを評価して次々に結合します。

July
が列挙型だと仮定すると:

public enum Month {
    January, February, March /* … */

    public LocalMonthDay prefixBind(Integer day) {
        return new LocalMonthDay(this, day);
    }

    public LocalYearMonth postfixBind(Integer year) {
        return new LocalYearMonth(this, year);
    }
}

LocalMonthDay
が次を定義しているとします:

public LocalDate postfixBind(Integer year) {
    return LocalDate.of(year, this.month, this.day);
}

還元は以下のように進みます。

  1. 2025 July 19
  2. July.postfixBind(2025)
     → 
    LocalYearMonth
  3. 19
    と結合できず)失敗 → 戻る
  4. July.prefixBind(19)
     → 
    LocalMonthDay
  5. .postfixBind(2025)
     → 
    LocalDate

アルゴリズムは左から右への結合を優先しますが、失敗した経路から 体系的に後退し、妥当な還元が見つかるまで他の選択肢を探索します。


なぜこの手法を使うのか?

binding expressions は以下のメリットがあります。

  • 型安全:Java そのものに DSL やリテラル文法を直接埋め込めます。
  • 基底型の改造やマクロ導入は不要です。
  • 隣接する型が持つ意味で、日付・単位・範囲などドメイン固有の セマンティクスを定義できます。

構築可能なものの例:

  • 単位系(
    299.8M m/s
  • 自然言語風 DSL(
    Meet Alice Tuesday at 3pm
    など)
  • ドメイン固有リテラル文法(通貨、時間間隔、範囲)

すべてが静的型安全で、実行時にマジックを使わずに済みます。


実験的な利用例

Manifold プロジェクトは binding expressions を次の領域で示しています。

領域説明
科学
manifold-science
は単位を結合式で実装し、SI 量子全体に対して算術・比較演算子を提供します。
範囲Range API は自然な範囲表現のために
to
のようなバインディングを使用します。
ベクトル
manifold.science.vector
では実験的なベクトルクラスが直接ベクトル演算をサポートし、例:
1.2m E + 5.7m NW
のように書けます。

IntelliJ 用 Manifold プラグインは binding expressions をネイティブにサポートしており、 入力中にライブフィードバックと解決を提供します。


欠点

問題内容
構文解析の複雑さ隣接は「二段階」パーシング問題で、グループ化が完全に解決されるまで属性付けが遅れます。結合系列を解くアルゴリズムは非 trivial です。
柔軟性 vs. 規律型が隣接値の組み合わせ方法を定義できるため、構文/意味境界が変わり、不適切な使用では安全でないと感じられることがあります。ただし、バインディングは静的型と具体的ルールに基づいています。
認知負荷通常の Java と混在させると初めは混乱します。これはラムダが登場した当初と同様です。

まだ実験段階

binding expressions は Manifold に数年入っているものの、現在も実験的です。
将来の取り組み例:

  • コンパイル時フォーマットルール(例:
    July 19
    が 2025 年に存在する日付かを検証)
  • 区切り文字・句読点のサポート
  • バインディングステートメント、還元アルゴリズムの特殊化など

興味がある方は Manifold リポジトリ の実装をぜひご覧ください。

同じ日のほかのニュース

一覧に戻る →