MyLisp(仮称)
自分の処理系でLandOfLispを動かしてみようと奮闘中。 でも define の使い方がちょっとずつ違う。。。 Scheme手習いと違うので混乱気味。 ;;land of lisp P13 (define guess-my-number () (ash (+ *small* *big*) -1)) ;;https://github.com/shirok/Gauche-L…
Scheme手習いの > が 自分の処理系でStackOverFlowになってしまうのです。コードはこんな感じです。 ;;p61 (define sub1 (lambda (n) (- n 1))) ;;p75 (define > (lambda (n m) (cond ((zero? n) #f) ((zero? m) #t) (else (> (sub1 n) (sub1 m)))))) (> 100…
比較関数を見直してたら間違い発見。 eq? はアドレス比較しなくてはいけないのか!http://www.shido.info/lisp/scheme5.html eq? 2つの引数をとり、2つのオブジェクトのアドレスを比較する。アドレスが等しければ真、 そうでなければ偽。 @Override public …
eq? をオブジェクト参照の比較で動かす場合、 シンボルのインスタンスを保持する必要がありそうなことがわかりました。さてどうやって管理しようか。。。 環境に現在までに発行したシンボルを持とうかとも思ったのですが でもどのタイミングでインスタンスを…
こんなバグがあったので修正。 (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.FunctionE…
再帰的にcarを覗いて行って 「lambda」で、なおかつ cdrが一つだったら末尾再帰と判定してみました。うまく動いたのでとりあえず次に行こうと思います。
再帰的にcarを覗いて行って 「lambda」だったら末尾再帰と判定してみました。微妙にうまくいかないところもあるけどとりあえずコミットしてみます。https://github.com/moremagic/MyLisp/commit/7ef2ed0a37a47aa31323d6b206a91f8e5a8ef6caなんでだろうなぁ
スタックのさかのぼり方がまずいみたいで 全然スタックの使用量が減ってないようです。ちゃんとスタックをさかのぼれるようにしたところ 変数の解決ができなくなる。環境がなくなっちゃってますね ><; スタックをさかのぼるときに環境も一緒に保持してあ…
末尾再帰が必要な関数に突入したら 1.末尾再帰フラグをON 2.現在の環境を変数に保持。 3.評価を停止。スタックを上る 4.評価の最後にたどり着いたら末尾再帰フラグを確認 5.末尾再帰フラグがONだったら フラグを倒して 6.保持した環境を使用して…
ファイル読み出しを書いてみたら スタックが足りなくなって止まっちゃう。これは末尾再帰最適化が必須だなとおもい、もう一回悩んでみる。 ググりまくって、どうもこんな感じというのを見つけたので実装してみた。末尾再帰の時は 1.評価を途中でやめる。 …
https://github.com/moremagic/MyLisp/commit/a942d4a30e60fd8584e2cc74f806a196696bb7d6 ;ファイル読み込みテスト ; http://www.geocities.jp/m_hiroi/func/abcscm07.html を参考にしました (define (type1 filename) (let ( (iport (open-input-file filen…
文字列型の対応しました。 文字列型を取り込めるようにパーサも修正。空白とかを何の考慮もなく次のAtomだと思ってパースしてたから 空白が混じる文字のパースができなかったので修正。あと、エスケープシーケンスにも対応できた。はず。。。細かいところの…
(let ((x 2)) (let ((y 3)) (+ x y))) ;5 (display "abc") ;"abc" ねむい。。。
(define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) (time (fib 30)) ;time は cdrの一つ目の実行時間を計測するデバック関数 ;実行結果 ;8918[ms] ;832040 結構遅くなっちゃった。 環境の取り回しが重くなったのが原因なのかなぁ。
MyLisp(仮称) で 以下サイトの make-bank-account が動くようになりました! http://www.shido.info/lisp/scheme_asg.html (define (make-bank-account amount) (lambda (n) (set! amount (+ amount n)) amount)) (define yamada-bank-account (make-bank-acc…
ココを見ていたら新たな新事実が。 http://www.shido.info/lisp/scheme_asg.html (define (make-bank-account amount) (lambda (n) (set! amount (+ amount n)) amount)) (define yamada-bank-account (make-bank-account 1000)) (yamada-bank-account 5000)…
(define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) (time (fib 30)) ;time は cdrの一つ目の実行時間を計測するデバック関数 ;実行結果 ;5285[ms] ;832040 こいつ、案外早いぞ。
MyLisp(仮称)の作成中。です。 https://github.com/moremagic/MyLisp/wiki lambda が二回続けてくるなんて想像もしてなかった。 結構悩んだ挙句、lambda 周りの処理を大きく修正。lambda が出現したときのみ環境変数から展開するといいのかな。 applyだけし…
MyLisp(仮称)の作成中。です。 https://github.com/moremagic/MyLisp/wikiScheme手習いの no-nums がどうも動かなかったのでずーっと悩んでました。 ※ 2,3日ほっといたのは内緒w isNumber? の評価前にapplyしていないのが原因でした。 public Sexp eval(…
多分これで大丈夫なはず。
cons、quote、+ を実装したところ。 もすこしうまくいったらそのうちのせます。consはこんな感じ。 public class ConsFunction implements IFunction{ @Override public Sexp eval(Cell cell, Map<String, Sexp> env) throws FunctionException{ if(cell.getCdr().length </string,>…