プログラム電卓(Blockly)へのクロージャーの導入
前回の「クロージャーの調査(1) - エレファント・コンピューティング調査報告」では「プログラム電卓」にクロージャーを導入するという方針だったのですが、方針を変えて「プログラム電卓(Blockly)」でクロージャーを使えるようにすることにします。JavaScriptではクロージャーが使えるため、「プログラム電卓(Blockly)」ではJavaScriptのプログラムとして実行しているので、関数の定義と定義した関数を式の中で使えるようにすれば良いと思われます。
クロージャーが使えるC#のコードで記述する言語
「ラムダ計算と無限ラムダ多項式(4) - エレファント・コンピューティング調査報告」では、クロージャーが使える言語をC#のコードとして書けるようにしています。以下のようなものです。
- Exp.Number ( 数値 )
- 数値を表します。「数値」は整数、文字列、または BigNum です。
- Exp.Bool ( 真理値 )
- 真理値を表します。
- Exp.String ( 文字列 )
- 文字列を表します。
- Exp.Name ( 文字列 )
- 変数名などの名前、または演算子を表します。
- Exp.Func ( 関数名, 引数リスト ) または Exp.Func ( 関数名, 引数, 引数, … , 引数 )
- 関数を実行します。関数名は名前または関数を表す式です。
- Exp.Let ( 変数名, 式 )
- 変数に式の値を代入します。
- Exp.Subst ( 変数名, 式 )
- すでに存在する変数に式の値を代入します。
- Exp.If ( 式(条件), 式(真のとき), 式(偽のとき) )
- 「式(条件)」が真のとき「式(真のとき)」、「式(偽のとき)」が評価されます。
- Exp.Define ( 関数名, 変数名リスト, 式 )
- 関数を定義します。
- Exp.From ( 文字列 )
- 式を表す文字列で式を作ります。(次の項を参照)
- new ExpBlock { 式, 式, … , 式 }
- 式を順の実行します。
- new ExpList { 式, 式, … , 式 }
- 式のリストを表します。
- new NameList { 式, 式, … , 式 }
- 名前のリストを表します。
「ラムダ計算と無限ラムダ多項式(6) - エレファント・コンピューティング調査報告」では以下の構文を追加しました。
- ( 式, 式, … , 式 )
- 式のリストを表します。
- Exp.Let ( 変数名, 変数名, … , 変数名 ) = 式のリスト
- 複数の変数に式のリストの各要素の値を代入します。
- Exp.Subst ( 変数名, 変数名, … , 変数名 ) = 式のリスト
- 複数のすでに存在する変数に式のリストの各要素の値を代入します。
「ラムダ計算と無限ラムダ多項式(8) - エレファント・コンピューティング調査報告」では無名関数の構文を追加しました。
- Exp.Fun ( new NameList { 変数名, 変数名, … , 変数名 }, 式 )
- 無名関数を表します。
クロージャーが使える通常の言語
「ラムダ計算と無限ラムダ多項式(5) - エレファント・コンピューティング調査報告」では、上記の言語を、通常のプログラミング言語の形式で記述するものを定義しています。Exp.From ( 文字列 ) という形式で書きます。仕様は以下のようになります。
- 数値、真理値、名前、または演算子
- 数値、真理値、名前、または演算子を書くことができます。
- 関数名 ( 引数, 引数, … , 引数 )
- 関数を実行します。関数名は名前または関数を表す式です。
- イテレーター . 名前
- イテレーターから next、getCurrent、setCurrent を取得します。
- let 変数名 = 式
- 変数に式の値を代入します。
- subst 変数名 = 式
- すでに存在する変数に式の値を代入します。
- If 式(条件) then 式(真のとき) else 式(偽のとき)
- 「式(条件)」が真のとき「式(真のとき)」、「式(偽のとき)」が評価されます。
- def 関数名 ( 変数名, 変数名, … , 変数名) = 式
- 関数を定義します。
- { 式; 式; … ; 式 }
- 式を順に実行します。
- 単項演算子
- 符号を変える ( - )
- 二項演算子
- 足し算 ( + )
- 引き算 ( - )
- 掛け算 ( * )
- 正の整数の割り算の商 ( / )
- x と y が正の整数のとき割り算の商を求めることができます。
- 正の整数の割り算の余り ( % )
- x と y が正の整数のとき割り算の余りを求めることができます。
- 累乗 ( ^ )
- 正の整数の正の整数乗(結果は整数の範囲)、または 10 の整数乗を求めることができます。
- 演算子の優先順位
以下の順になります。
^ | |||||
* | / | % | |||
+ | - | ||||
== | != | < | <= | > | >= |
「ラムダ計算と無限ラムダ多項式(6) - エレファント・コンピューティング調査報告」では以下の構文を追加しました。
- ( 式, 式, … , 式 )
- 式のリストを表します。
- let ( 変数名, 変数名, … , 変数名 ) = 式のリスト
- 複数の変数に式のリストの各要素の値を代入します。
- subst ( 変数名, 変数名, … , 変数名 ) = 式のリスト
- 複数のすでに存在する変数に式のリストの各要素の値を代入します。
「ラムダ計算と無限ラムダ多項式(8) - エレファント・コンピューティング調査報告」では無名関数の構文を追加しました。
- fun ( 変数名, 変数名, … , 変数名 ) = 式
- 無名関数の文字列版です。
クロージャー調査用言語
「ラムダ計算と無限ラムダ多項式(10) - エレファント・コンピューティング調査報告」ではクロージャーの調査のため以下のような言語を定義しています。