LISP と LOGO の本がいくつか見つかりましたが、LISP の本は古いのでクロージャーが使えるのかどうかよくわかりません。クロージャーの変数を変更できないようにしたらどうなるかを調べることが目的なので、この意味では LOGO を使って調べた方が良いかもしれません。最近の LISP ではクロージャーが使えるようなのでどちらでも良いかもしれません。
Calc クラスの RepeatGenerator をラムダ式で書き直しました。これが式だけのラムダ式で書くことができれば、式木(expression tree)というものに変換することができて、式の構造を扱うことができるらしいのですが、式だけのラムダ式で書くことは難しいのでこの方向はいったんやめます。
ラムダ式のようなものを自力で実装することにします。後でこれを LISP か LOGO のように書き直すことにします。
Calc クラスの RepeatGenerator をラムダ式で書き直したものは以下のようになります。
public static Func<string> RepeatGenerator = () => { BigNum number = new BigNum(); BigNum square_difference = new BigNum(3); (BigNum, BigNum, int) nums = (number, square_difference, 0); (Func<bool> next, Func<int> getCurrent, Action<int> setCurrent) generator = GenerateDecimal(); Func<int> GetNextDecimalDigit = () => { generator.next(); return generator.getCurrent(); }; Func<BigNum, int, int, BigNum> repeat = null; repeat = (BigNum number, int e, int count) => { if (e < count) { return repeat(number + new BigNum(GetNextDecimalDigit(), -e), e + 1, count); } else { return number; } }; BigNum result_number = repeat(new BigNum(), 0, count); return result_number.Print(); };