lisp on yarv製作日誌1

今日から、卒研作成しているLispの処理系の製作日誌を書くことにしました。

今日は、if文を使えるようにしました。

| tLPAREN keyword_if sexp sexp sexp ')'
                    {
		      $$ = NEW_LIF($3, $4, $5);
		    }

パーサはこんな感じです。

次はコンパイルの部分

case NODE_LIF:{
	LABEL *else_label, *end_label;
	else_label = NEW_LABEL(nd_line(node));
	end_label = NEW_LABEL(nd_line(node));
	
	//cond
	lisp_compile(iseq, ret, node->nd_lcond, poped);
	ADD_INSNL(ret, nd_line(node), branchunless, else_label);
	
	//then
	lisp_compile(iseq, ret, node->nd_lt, poped);
	ADD_INSNL(ret, nd_line(node), jump, end_label);

	//else
	ADD_LABEL(ret, else_label);
	lisp_compile(iseq, ret, node->nd_lf, poped);

	ADD_LABEL(ret, end_label);
	break;
   }

わりと簡単にできました。
で実行してみると、

def ==(i, j)
 i==j
end

lblock
 (if (== 10 10) (puts 10) (puts 20))
end

ちゃんと10が表示されます。