Add や Sub を実装していておもったのですが、ランタイムにおける現状の Literal, LitInt などは、最初リテラルが変換されてこの形になるのですが、その後の計算で値が書き換わっていくので、それを「リテラル」と呼び続けるのは無理がある気がする。
Value だと、一般的すぎるかもしれないけど、なんか、そういう名前に変えたい。
オリジナル STG がどうしていたのかなど確認した上で、リネームしたい。
計算結果の格納には、すでにある BoxedIntObj, BoxedCharObj を使えばいいのではないか?
RT.java より:
private void evalLiteral(){ AtomExpr e = (AtomExpr) code; Literal x = (Literal) e.a; if (x instanceof LitInt) { code = new AtomExpr(new Var(new BoxedIntObj((LitInt)x))); } else if (x instanceof LitChar){ code = new AtomExpr(new Var(new BoxedCharObj((LitChar)x))); } else { code = new ErrExpr("non-exaustive cases in evalLiteral."); } }
やはり、リテラルと計算結果オブジェクトは型を変えた方がいいように思う。
初めて計算されるときに、具体的な型が決まり、その後は型 (eg. Int か Integer か) が確定するので。
ランタイムで型チェックと分岐をしないで済むためにも、Core で fromIntegral などを挿入したほうがいいのかもしれない。