MyLisp(仮称) スキーマ手習いの eq?-c が動くようになった。
MyLisp(仮称)の作成中。です。
https://github.com/moremagic/MyLisp/wiki
lambda が二回続けてくるなんて想像もしてなかった。
結構悩んだ挙句、lambda 周りの処理を大きく修正。
lambda が出現したときのみ環境変数から展開するといいのかな。
applyだけしてevalしないように修正してみた。
public static Sexp lambdaApplys(Sexp sexp, Map<String, Sexp> env){ if(sexp instanceof Cell){ Sexp[] sexps = ((Cell)sexp).getSexps(); Sexp[] bufs = new Sexp[sexps.length]; for(int i = 0 ; i < sexps.length ; i++){ bufs[i] = lambdaApplys(sexps[i], env); } return new Cell(bufs); }else{ if( env.containsKey(sexp.toString()) ){ return env.get(sexp.toString()); }else{ return sexp; } }
(define eq?-c (lambda (a) (lambda (x) (eq? x a)))) ((eq?-c 'salada) 'salada) ;#t
やっとうごいたー