こんなバグがあったので修正。

(define rember
  (lambda (a lat)
    (cond
      ((null? lat) '())
      ((eq? (car lat) a) (cdr lat))
      (else (cons (car lat)
            (rember a (cdr lat)))))))

MyLisp > (rember and '(bacon lettuce and tomato))

ERROR
mylisp.func.FunctionException: car: expects argument of type <pair>; given #f

他の処理系で確認してもこれでちゃんと動く
apply するとき環境から値を解決してほしいんだけど
間違って評価しちゃっているようです。


car した時、IPairで帰ってきてたんですけど
AtomSymbol クラスでないと評価しちゃってたのが原因ぽい。
なので IPair の時も環境からの解決ができるように修正。

    public static Sexp apply(Sexp sexp, Map<AtomSymbol, Sexp> env) throws FunctionException {
        Sexp ret = sexp;

        if (sexp instanceof AtomSymbol && env.containsKey((AtomSymbol) sexp)) {
            ret = env.get((AtomSymbol) sexp);
        } else if (sexp instanceof IPair && ((IPair) sexp).getList().length == 1 && ((IPair) sexp).getList()[0] instanceof AtomSymbol) {
            AtomSymbol buf = (AtomSymbol) ((IPair) sexp).getList()[0];
            if(env.containsKey(buf)){
                ret = env.get(buf);
            }
        } else if (sexp instanceof IPair) {
            ret = eval((IPair) sexp, env);
        }

        return ret;
    }
(define rember
  (lambda (a lat)
    (cond
      ((null? lat) '())
      ((eq? (car lat) a) (cdr lat))
      (else (cons (car lat)
            (rember a (cdr lat)))))))


MyLisp > (rember and '(and bacon lettuce and tomato))
[eval] (rember and (quote (and bacon lettuce and tomato)))
>> (bacon lettuce and tomato)

だんだんコードが汚くなってきた><;
コミットログも間違えちゃったしorz

git revert したんですが コードもなくなっちゃったので
再度 revert。コミットログが汚い><;
そのうち何とかしよう。。。

https://github.com/moremagic/MyLisp