go-

http://morihyphen.hp.infoseek.co.jp/files/go-.tar.gz
名前はてきとう。

READMEすら書いてねー。
go-はLispモドキC++なんちゃらかんちゃらです。libgaucheがいります。

int
main(){
	using namespace goshpp;

	Scm_Init( GAUCHE_SIGNATURE );
	init_goshpp();
	Symbol a("a");
	Symbol b("b");
	Symbol c("c");

	write( eval (_(lambda >> (a>>b) >> (plus>>a>>b)) >> 3 >> 4) ) ;
	write( "\n" );

	write( eval (let >>
		     (_(a >> 4) >> (b >> 5)) >>
		     (plus >> a >> b)) );
		     
	write( "\n" );
	

	Scm_Flush( SCM_CUROUT );
}

こういうのが、

(write (eval '((lambda (a b) (+ a b)) 3 4)))
(write "\n")
(write (eval '(let ((a 4) (b 5)) (+ a b))))
(wriet "\n")

こんな感じのアレのソレのあれ。

背景

  1. RubyのブロックがC++のテンプレート駆使してできたらおもしろそうじゃない?node.hとかあるんだし。
  2. るびーめんどー Lispだったらすぐじゃね?
  3. そういえば、あろはさんがlibgaucheどうのこうの言ってたような

そんな感じで。

なんか

右結合にするのが大変だった。operator,はなんか普通じゃないと今日知った。どっかで読んだような気もするんだけど。
_()は、( (a>>b)>>c)が (a >> b >> c)になってしまうのをふせぐのに必要です。( a >> (c>>d) )はいけたんだけど…


C++が使えればなんでもよかった。まあ、それなりに勉強になったのでよい。


あー、libgaucheの使いかたは、

	ScmPair *pair = SCM_NEW(ScmPair);
	SCM_SET_CAR( pair, cdr );
	SCM_SET_CDR( pair, SCM_NIL );
	return (ScmObj)pair;

なんかひたすらこういうのを組み立てていけば終わりみたいな感じかと思われます。