Applyのバグ修正
こんなバグがあったので修正。
(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。コミットログが汚い><;
そのうち何とかしよう。。。