より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あたりが参考になるかな。