シンボルの管理
eq? をオブジェクト参照の比較で動かす場合、
シンボルのインスタンスを保持する必要がありそうなことがわかりました。
さてどうやって管理しようか。。。
環境に現在までに発行したシンボルを持とうかとも思ったのですが
でもどのタイミングでインスタンスを開放すればいいのかわからなかったりするのです。
なので、シンボルのインスタンス管理をやめてしまいました。(キリッ
シンボル名をEquals で比較し eq? を実装することにしてみました。
@Override public Sexp eval(IPair cons, Map<AtomSymbol, Sexp> env) throws FunctionException { super.checkArgmunet(cons, 2); Sexp[] list = cons.getCdr().getList(); Sexp sexpA = MyLisp.apply(list[0], env); Sexp sexpB = MyLisp.apply(list[1], env); //これだと難しいので。。。 // return Atom.newAtom(sexpA == sexpB); //こっちで対応 //各実装クラスで equals の取り扱いを決めることに。 return Atom.newAtom(sexpA.equals(sexpB)); }
アトムの種類によって
Symbol は Symbol名.equals
Number は Number.equals
Sring は ==
のようにすれば 今のところそれっぽく動いています。
MyLisp > (define str "hello") [eval] (define str "hello") >> STR MyLisp > (eq? str str) [eval] (eq? str str) >> #t MyLisp > (eq? "hello" "hello") [eval] (eq? "hello" "hello") >> #f MyLisp > (eq? 3 3) [eval] (eq? 3 3) >> #t MyLisp > (eq? 3.0 3.0) [eval] (eq? 3.0 3.0) >> #t MyLisp >
もし、ダメだったらその時考えるということで。
どうなることやら。