スポンサーサイト

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

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

関数型プログラム

2008年11月19日 23:53

関数型プログラムを実験してみました。

実装した内容は、カリー化なんですが、思いのほか面倒でした。。。
けど、boost の bind2nd とかよりは格段に使いやすいですよ。
なかなか面白いものができたので公開してみます。

#include
#include "macro.h"
#include "typelist.h"
#include "service.h"
#include "functor.h"


double FunctorTest( float arg1, int arg2, char *arg3 )
{
  printf( "%-8s : (%.2f + 1) * %2d = ", arg3, arg1, arg2 );
  return double((arg1+1) * arg2);
}

template< typename Func >
double FunctorCallTest( Func f )
{  return f(5.0f, "call");  }

void main()
{
  Functor functorFactory;
  char str[] = "hoge";

  // bind テスト
  printf( "%6.2f\n", functorFactory(FunctorTest, Binder::unbind, 10, str )( 1.23f ) );
  printf( "%6.2f\n", functorFactory(FunctorTest, 2.46f, Binder::unbind, str )( 5 ) );
  printf( "%6.2f\n", functorFactory(FunctorTest, 3.69f, 3, Binder::unbind)( "hogehoge" ) );

  // bind することで違う関数を生成しているのを試すテスト
  printf( "%6.2f\n", FunctorCallTest( functorFactory(FunctorTest, Binder::unbind, 20, Binder::unbind) ) );
}



こんなプログラムを走らせると、、、

hoge : (1.23 + 1) * 10 = 22.30
hoge : (2.46 + 1) * 5 = 17.30
hogehoge : (3.69 + 1) * 3 = 14.07
call : (5.00 + 1) * 20 = 120.00



こんな結果が返ってきます。

バインドしたくない部分は Binder::unbind で置き換えてるわけですね。



ソースは以下。

ヘッダー
macro_h.txt
service_h.txt
typelist_h.txt
functor_h.txt

コード
sample_cpp.txt

macroとservice、typelist はTypeTraisとかTuple、Typelistを定義しているだけです。
Functor が今回最大の目玉。
特にカリー化している最中の処理は面白いです。
Tupleに収まっている引数をマージして新しいTupleを作成、それを引数として関数を呼んでいます。
かなり難解なので、良かったら読みほどいてくださいw

ちなみに、汎用化のためにマクロをこれでもか!というぐらい使用していますので、物凄く見づらいソースになっていますw
スポンサーサイト


最近の記事


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