スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++言語で関数型プログラミング 序章

2006年08月07日 17:33

以前書いたブログに Closure のこと書いてて、その記事の技術、全然公開してなかったから説明しながら公開していこうかと思います。


っていっても、Boost の Lambda みたいに綺麗になってないんだけどね。
けど機能はこっちの方が上だ!って自負がありますよこれ( ・`ω・´)

無名関数だって使えるし、遅延評価だってできます。
Haskell みたいに完全遅延評価(グラフリダクションっていうらしい。並列で遅延評価するって意味なのかな?)は出来ないけどね。
(出来たら恐ろしいけどw)



んで、本題。

やりたかったことはっていうと、

 1:動的に関数を生成する
 2:1で生成された関数も同じように動的に生成する関数の部品として再利用できちゃう
 3:無名関数みたいに、値が決まって無くてもあとで値を入れれば動いちゃう。
 
っていうことですね。
まぁ、要するに「式」をオブジェクト化したかったワケです。
「式」同士を演算子で結合できたりね。


Lambda の実装に触発されて出来たわけですけど機能は大分違いますね。

また、冒頭で Lambda みたいに綺麗になってないといいましたが、全て Template が生成する「実態」だけで済ませている Lambda と違い、このクラス(TCClosure と呼んでます)は new や malloc などで動的に確保したメモリを使用することでC言語特有の「汚い」実装になってるからです。
その代わり汎用的に出来るわけです。

実際、Lambda を有機的に使う場合、必ず Template 関数なりにしなければいけなかったところ、
Lambda の場合、型が自動的に作られるのと生成される型が複雑なので、
 とてもじゃないが指定して使うなんてことができない)
TCClosuer は戻り値だけ特定すれば、どんな関数やクラスでも利用可能です。
要するに、テンプレートの引数として必要なのは戻り値の型だけなんですね。


また、違う戻り値の TCClosure も型キャストさえ出来れば組み合わせて使う(組み合わせることで新しい TCClosure を生成する)ことが出来ます。



んで、どうやって実装しているか?
いきなり核心の部分を説明してもかなりわかりにくいです。


なんで、まずは簡単なことを考えましょう。

どうやって式をオブジェクト化するか?

これだけでもかなり抽象的ですねw

まず単純に考えて、
 a + b = f
において、
 「f の値を動的(必要な時)に求める」
が出来ればよさそうな気がします。

それじゃこれをクラス化してみましょう。


a を項クラス term とします。
そうすると、b は term クラスの保持する値が違うだけなので、同じ term クラスとして扱えます。
また、f は結果なので result クラスとします。

そうすると、a + b = f の式は
 term + term = result
と書けますね。


さて、ここで式の再利用を考えると result クラスの部分を term と置き換えれば上手く行きそうな気がします。
result = term とすれば term と term を演算子でつなぐと term を返す
これなら出来上がった term を使ってまた新しい「式」を定義できそうです。

そうです、これが Lambda で使ってる技術なんです。
Lambda の場合、全て「一つの部分」でやっちゃう
(たとえば
  ((_1 * 100 + _2 + 10)(1,2))
 など、式を変数として保存するのではなく、関数の引数として書いたり一箇所にまとめて書く)
ので、ワザワザ「式」を保存するオブジェクトを定義する必要がありません。
ですから、(Lambda の場合は)戻り値を再帰的に使って実現してるわけです。

(上の例では
 _1 * 100 で一つ戻り値が出来て(これを term1 とする)
 term1 + _2 でもう一つ戻り値が出来る(これを term2 とする)
 さらに term2 + 10 でもう一つ戻り値が出来る(これを term3 とする)
 よって、結局 term3(1,2) が呼ばれるわけです)



とりあえず今日はここまで。

次回は(いつになるかわからんけど)これの実装方法とか必要になるクラスのこととか書きます。




blog_rank

スポンサーサイト


コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://angra.blog31.fc2.com/tb.php/68-35589b5d
    この記事へのトラックバック


    最近の記事


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。