{{{ GoogleAdsense <script type="text/javascript"><!-- google_ad_client="pub-3720045127958150"; google_ad_host="pub-9941151214016196"; google_alternate_color="FFFFFF"; google_ad_width=468; google_ad_height=60; google_ad_format="468x60_as"; google_ad_type="text_image"; google_color_border="003399"; google_color_bg="EEEEEE"; google_color_link="0000FF"; google_color_url="0000FF"; google_color_text="000000"; //--></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> }}} [[BR]] [ExNewProgLang ← 前のページに戻る] === 8. 六式言語: クロージャと高階関数をサポートするプログラミング言語 ==== 8.1 クロージャと高階関数をサポートするプログラミング言語とは さて、次はクロージャと高階関数を組み合わせてみましょう。 クロージャと高階関数についても組み合わせて考えることは簡単です。 クロージャは引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とするでした。 つまり関数内のローカル変数の状態が保存されました。 このクロージャと高階関数を組み合わせると、関数内のローカル変数を操作する関数をその関数の外の関数型の変数から呼び出せるようになります。 次の例を見てください。 [[BR]] {{{ // sample program for enhanced PL/0 var INC:func, DEC:func, DOUBLE:func, PR:func; int: function counter(); begin var n:int; int: function Inc(); begin n = n + 1; print n; end int: function Dec(); begin n = n - 1; print n; end int: function Double(); begin n = n * 2; print n; end int: function Pr(); begin print n; end n = 0; INC = Inc; DEC = Dec; DOUBLE = Double; PR = Pr; end begin counter(); PR(); INC(); INC(); INC(); INC(); INC(); INC(); INC(); DEC(); DEC(); DEC(); INC(); INC(); DOUBLE(); PR(); end }}} 関数counterの中で、変数nとInc, Dec, Double, Pr関数をローカル関数として定義しています。 そして、変数nは0に、外部の変数INCに関数Inc, 変数DECに関数Dec、変数DOUBLEに関数Double、および変数PRに関数Prを設定しています。 これにより、変数nは関数counter内のクロージャ変数となります。 変数INC、DEC、DOUBLE、PRには、関数counter内のローカル定義関数が高階関数として設定され、counter関数の外からも関数として呼び出されるようになりました。 このようにクロージャと高階関数と組み合わせるとあたかも関数をオブジェクト指向のオブジェクトのように扱うことができるようになるのです。 ==== 8.2 六式言語の改造点 ===== 8.2.1 いかに実現するか? 六式言語も五式言語と同様で、ベースに四式言語である高階関数をサポートするプログラミング言語を使いましょう。これは手続き言語に高階関数を実現したものでした。 この五式言語に、クロージャをサポートする言語である三式言語の改造点を加えます。 [[BR]] {{{ - C言語への出力のローカル変数の定義にstaticを付ける }}} これにより、関数内の変数が関数の実行終了後も値が保持され続けます。 さらにこの修正に加えて、六式言語では配列の定義もできるようにしましょう。 ==== 8.3 六式言語のソース ==== 8.4 六式言語のソースのコンパイル方法 {{{ GoogleAdsense <script type="text/javascript"><!-- google_ad_client = "ca-pub-3720045127958150"; /* 728x90, 作成済み 10/04/09 */ google_ad_slot = "4963196949"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> }}}