HN 日本語サマリー

← 一覧へ戻る
プログラミング

Show HN: AttaLambda: a language where types and data are made of untyped lambdas

Show HN: AttaLambda: a language where types and data are made of untyped lambdas (attalambda.com)

27 pointsby kserrec0 コメント

要約

AttaLambdaは、型、データ構造、制御フローなど、言語のほぼ全ての要素を型なしラムダ計算で構成した、Lisp風の新しいプログラミング言語です。Racketを基盤としつつ、計算の大部分は純粋なラムダの世界に留まります。エラー処理や数値型(チャーチ数ではなくバイナリリストエンコーディングを使用)にも独自のアプローチを採用しており、ラムダ計算の探求を深めたい開発者にとって興味深い試みとなっています。

全文翻訳

プログラミング言語を作りました!

AttaLambdaと名付けました。

このアイデアはこうです:意味のある計算がすべて無名ラムダ計算で行われる、実用的なLisp風言語。論理、算術、データ構造、制御フロー、さらには型までもが、すべて無名ラムダです。外の世界を扱うための小さく明示的なRacketレイヤーが境界に配置され、構文糖衣のためのいくつかのマクロもあります。

これはその物語です:

数年前に、無名ラムダ計算をいじり、チュートリアルが止まるよりも先に進みたいと思いました。チュートリアルではブール値、数値、算術、おそらくYコンビネータまで示されますが、そこで止まります。私はそれらをさらに進めたかったのです。

そこで「All The Lambdas」というプロジェクトを開始しました。Racketを遅延評価モードに設定し、実際の計算にはラムダという一つのRacketコンストラクトのみを使用し、整数、有理数、リスト、バイナリ桁リストによる数値エンコーディング、探索アルゴリズムなどを構築しました。

その後、Greg Michaelsonの「Functional Programming Through Lambda Calculus」という本を見つけました。この本の中で、Michaelsonは無名ラムダ計算で構築された言語の骨子をスケッチしており、型付きオブジェクト自体が型タグと値を含むペア関数である型システムが含まれています。

私はそれが興味深いと感じ、このアイデアを実装・拡張しました。これもすべて無名ラムダのみで行いました。私はプログラミング言語理論のバックグラウンドがないため、試行錯誤しながら進めました。

その後、しばらくの間、このプロジェクトから離れていました。

最近戻ってきて、コーディングエージェントの助けを借りて、これを実用的な言語にできないかと考えました。All The Lambdasの大部分を基盤として再利用しました。

こうしてAttaLambdaが誕生しました。

追加の詳細:

  • Rat(その数値型)は、チャーチ数ではなくバイナリ桁リストエンコーディングを使用しているため、数値は値ではなくバイナリ桁数に応じてスケールします。
  • エラーはRacketの例外ではなくラムダエンコードされた値であり、通常のデータのように言語内を伝播します。
  • Racketホストは、還元不可能な外部操作のみを実行します。HTTPの解析、ルーティング、レスポンス構築のようなものでさえ、純粋なラムダの世界に留まります。
  • 再帰はラムダ計算の再帰を使用します。ループや真の自己参照はなく、下にはYコンビネータがあるだけです。
  • 自動的な純粋性チェックは、ネイティブ計算が純粋な部分に漏れ出すといった意図しない不正行為を検出します。
  • 複数引数ラムダ、let、cond、listのような構文は、単項ラムダと適用に還元されるマクロ糖衣にすぎません。

いくつかのコード例:(printを除く、ここにあるすべてのものは単項無名ラムダに還元されます)

階乗:

  #lang attalambda

  (rec factorial n =
    (cond
      ((eq n 0) 1)
      (else (mult n (factorial (sub n 1))))))

  (print (factorial 10))

これは次のように出力されます:

  3628800

または正確な調和級数:

  #lang attalambda

  (print
    (reduce add 0
      (map (lambda (n) 
             (unwrap-ok (div 1 n)))
           (range 1 8))))

これは正確に次のように出力されます:

  363/140

私の知る限り、これらの特徴をすべて組み合わせたプログラミング言語はありません。Michaelsonスタイルの型タグが無名ラムダから構築され、バイナリ桁リストに裏打ちされた正確な有理数、ラムダ値としてのエラー、そしてほとんどすべての計算が無名ラムダコア内に留まる実世界のプログラムです。これらの要素のいずれも個別に新しいものではありませんが、これらをこの方法で組み合わせた他の言語は知りません。

ダウンロード: https://github.com/kserrec/attalambda/releases/tag/v0.7.0

コード: https://github.com/kserrec/attalambda

元のAll The Lambdas: https://github.com/kserrec/all_the_lambdas