よりLispっぽく見せる

昨日(d:id:earth2001y:20061001:p2)の続きというか、西尾さんの

マクロで見かけをLispそっくりにできないのかなぁ、と思った。

のコメントを踏まえて。時間があまり無いので、ろくに考えずに。

#include "purelisp.h"

#define t   T::eval
#define nil NIL::eval
#define cons(x,y) CONS::eval
#define car(x)    CAR::eval
#define cdr(x)    CDR::eval
#define atom(x)   ATOM::eval
#define eq(x,y)   EQ::eval

と、一番手っ取り早いやりかたをやった。
そうすると、

int main()
{
    eq(cons(t,t), nil) f1();
    eq(cons(t,t), cons(t,car(cons(t,nil)))) f2();

    cout << typeid(f1).name() << endl;
    cout << typeid(f2).name() << endl;

    return 0;
}

なふうにインスタンス化が行え、evalを意識せずに済むようになります。

でもS式でないので、いまいちLispっぽくありません。M式(Meta Expression)というらしいですね。使われなくなっただけで、M式のLispというのもあるらしいですが。とりあえず、evalを意識しないで済むようにはなったので、第一義はクリアしたと考えてよさそうですが・・・*1

時間があるときにもう少し考えてみようとは思います。Boost.MPL や Boost.preprocessorあたりが参考になるかな。

*1:いや、第一義はテンプレートだけで、純Lispの関数セットと等価な記述を実現するだけだったはずだ