eq? 関数 はアドレスを比較する
比較関数を見直してたら間違い発見。
eq? はアドレス比較しなくてはいけないのか!
http://www.shido.info/lisp/scheme5.html
1 2 3 4 5 |
<blockquote> <p>eq?<br /> 2つの引数をとり、2つのオブジェクトのアドレスを比較する。アドレスが等しければ真、 そうでなければ偽。</p> </blockquote> |
@Override public Sexp eval(IPair cons, Map<AtomSymbol, Sexp> env) throws FunctionException { super.checkArgmunet(cons, 2);
1 2 3 4 5 6 Sexp[] list = cons.getCdr().getList(); Sexp sexpA = MyLisp.apply(list[<span class="synConstant">0</span>], env); Sexp sexpB = MyLisp.apply(list[<span class="synConstant">1</span>], env); <span class="synComment">//誤り; return Atom.newAtom(sexpA.toString().equals(sexpB.toString()));</span> <span class="synStatement">return</span> Atom.newAtom(sexpA == sexpB); }
MyLisp > (define str "hello") eval >> STR MyLisp > (eq? str str) eval >> #t MyLisp > (eq? "hello" "hello") eval >> #f MyLisp > (eq? 1 1) eval >> #f
問題ないようです。
https://github.com/moremagic/MyLisp
moremagic
2014-05-31