プログラミング
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)
要約
AttaLambdaは、型、データ構造、制御フローなど、言語のほぼ全ての要素を型なしラムダ計算で構成した、Lisp風の新しいプログラミング言語です。Racketを基盤としつつ、計算の大部分は純粋なラムダの世界に留まります。エラー処理や数値型(チャーチ数ではなくバイナリリストエンコーディングを使用)にも独自のアプローチを採用しており、ラムダ計算の探求を深めたい開発者にとって興味深い試みとなっています。
全文翻訳
プログラミング言語を作りました!
AttaLambdaと名付けました。
このアイデアはこうです。意味のある計算がすべて型なしラムダ計算で行われる、実用的なLisp風言語です。ロジック、算術、データ構造、制御フロー、さらには型までもが、すべて型なしラムダです。境界を処理するために、小さな明示的なRacketレイヤーが外部世界を扱い、構文糖衣のためのいくつかのマクロがあります。
これがその物語です。
数年前、型なしラムダ計算を遊びたいと思い、チュートリアルが止まる場所を超えたいと思いました。チュートリアルではブーリアン、数値、算術、おそらくYコンビネータを示し、そして止まります。私は彼らに続けさせたいと思いました。
そこで、「All The Lambdas」というプロジェクトを開始しました。Racketを遅延評価に設定し、実際の計算には1つの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スタイルの型タグが型なしラムダから構築され、バイナリ数字リストに裏打ちされた正確な有理数、ラムダ値としてのエラー、そしてほとんどすべての計算がラムダコア内に留まる実世界のプログラムです。これらのピースのいずれも個別に新しいものではありませんが、これらをこの方法で組み合わせた他の言語は知りません。
ダウンロード:
<a href="https://github.com/kserrec/attalambda/releases/tag/v0.7.0" rel="nofollow">https://github.com/kserrec/attalambda/releases/tag/v0.7.0</a>
コード:
<a href="https://github.com/kserrec/attalambda" rel="nofollow">https://github.com/kserrec/attalambda</a>
オリジナルのAll The Lambdas:
<a href="https://github.com/kserrec/all_the_lambdas" rel="nofollow">https://github.com/kserrec/all_the_lambdas</a>