比較関数を見直してたら間違い発見。
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