エレファント・ビジュアライザー調査記録

ビジュアルプログラミングで数式の変形を表すことを考えていくブロクです。

クロージャーの調査(5)

今後の予定

前回の「クロージャーの調査」では

「クロージャーの調査(2) - エレファント・ビジュアライザー調査記録」では

について説明していました。言語3はまだ実装していません。言語2をパーサコンビネータで書き直して、それを改造して言語3を実装することを考えます。

「中間報告(19) - エレファント・ビジュアライザー調査記録」では以下のものに Python、TypeScript を使うと書きましたが、まず C# で書いてみることにします。

と書きましたが、まず言語3を C# のサブセットとして定義することができないか検討したいと思います。C# のコードとして書けるといろいろできて便利だからです。また ChatGPT で調べてみました。

入力: 簡単な関数型プログラミング言語の仕様を、できるだけ C# のサブセットになるように作ってください

結果:

以下に、C# のサブセットとなる簡単な関数型プログラミング言語の仕様を示します。この言語は、純粋関数型の特徴を持ちながら、C# の構文と互換性があります。

言語名: FunCSharp

1. 基本要素

  • åž‹: int, bool, string, Unit (空の型、関数が値を返さない場合に使用)
  • 値のイミュータビリティ: すべての変数とデータ構造は不変。
  • 関数: 一級オブジェクト。関数自体を引数や戻り値に使用可能。
  • 式のみ: 文ではなく、すべてが式として評価される。

2. 文法

宣言
let x = 42;          // 定数宣言
let add = (a, b) => a + b; // 関数宣言
関数呼び出し
let result = add(5, 10);
条件分岐
let max = (a, b) => a > b ? a : b;
再帰
let factorial = n => n == 0 ? 1 : n * factorial(n - 1);
パターンマッチ
let describe = x => 
    x switch {
        0 => "zero",
        1 => "one",
        _ => "many"
    };
リスト操作

リスト型は組み込みで提供され、操作は関数型の方法で行います。

let list = [1, 2, 3];
let doubled = list.Select(x => x * 2);
let filtered = list.Where(x => x > 1);

3. 制約

  • ミュータブル変数なし: var キーワードは使用不可。
  • 副作用なし: 関数は外部状態を変更できない。
  • 制御構文の制限: for, while は使用不可。代わりに再帰や高階関数を利用。

4. 標準ライブラリ

  • 高階関数: map, filter, reduce など。
  • データ構造: リスト、タプル、オプション型 (Some, None)。
  • 組み込み関数: print, length, sum など。

5. サンプルプログラム

フィボナッチ数列
let fib = n =>
    n switch {
        0 => 0,
        1 => 1,
        _ => fib(n - 1) + fib(n - 2)
    };

let result = fib(10);
リスト処理
let numbers = [1, 2, 3, 4, 5];
let squares = numbers.Select(x => x * x);
let evenSquares = squares.Where(x => x % 2 == 0);

print(evenSquares); // [4, 16]

この仕様では、C# の構文を活用しながら、純粋関数型プログラミングの概念をシンプルに学べます。必要に応じて、追加機能を拡張できます。