MyLisp(仮称)

define の罠

自分の処理系でLandOfLispを動かしてみようと奮闘中。 でも define の使い方がちょっとずつ違う。。。 Scheme手習いと違うので混乱気味。 ;;land of lisp P13 (define guess-my-number () (ash (+ *small* *big*) -1)) ;;https://github.com/shirok/Gauche-L…

Scheme手習い の > が動かない。

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? 関数 はアドレスを比較する

比較関数を見直してたら間違い発見。 eq? はアドレス比較しなくてはいけないのか!http://www.shido.info/lisp/scheme5.html eq? 2つの引数をとり、2つのオブジェクトのアドレスを比較する。アドレスが等しければ真、 そうでなければ偽。 @Override public …

シンボルの管理

eq? をオブジェクト参照の比較で動かす場合、 シンボルのインスタンスを保持する必要がありそうなことがわかりました。さてどうやって管理しようか。。。 環境に現在までに発行したシンボルを持とうかとも思ったのですが でもどのタイミングでインスタンスを…

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.FunctionE…

末尾再帰判定できた

再帰的にcarを覗いて行って 「lambda」で、なおかつ cdrが一つだったら末尾再帰と判定してみました。うまく動いたのでとりあえず次に行こうと思います。

末尾再帰判定 暫定版

再帰的にcarを覗いて行って 「lambda」だったら末尾再帰と判定してみました。微妙にうまくいかないところもあるけどとりあえずコミットしてみます。https://github.com/moremagic/MyLisp/commit/7ef2ed0a37a47aa31323d6b206a91f8e5a8ef6caなんでだろうなぁ

末尾再帰最適化 環境保持ができない

スタックのさかのぼり方がまずいみたいで 全然スタックの使用量が減ってないようです。ちゃんとスタックをさかのぼれるようにしたところ 変数の解決ができなくなる。環境がなくなっちゃってますね ><; スタックをさかのぼるときに環境も一緒に保持してあ…

末尾再帰でスタックオーバフローになるのはどうにかなった

末尾再帰が必要な関数に突入したら 1.末尾再帰フラグをON 2.現在の環境を変数に保持。 3.評価を停止。スタックを上る 4.評価の最後にたどり着いたら末尾再帰フラグを確認 5.末尾再帰フラグがONだったら フラグを倒して 6.保持した環境を使用して…

末尾再帰最適化

ファイル読み出しを書いてみたら スタックが足りなくなって止まっちゃう。これは末尾再帰最適化が必須だなとおもい、もう一回悩んでみる。 ググりまくって、どうもこんな感じというのを見つけたので実装してみた。末尾再帰の時は 1.評価を途中でやめる。 …

ファイル読み込み open-input-file, read-char, eof-object? に対応

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…

string? boolean? なんかに対応

文字列型の対応しました。 文字列型を取り込めるようにパーサも修正。空白とかを何の考慮もなく次のAtomだと思ってパースしてたから 空白が混じる文字のパースができなかったので修正。あと、エスケープシーケンスにも対応できた。はず。。。細かいところの…

Let(名前付き、名前なし) Display 関数を作成

(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 結構遅くなっちゃった。 環境の取り回しが重くなったのが原因なのかなぁ。

make-bank-account に対応

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(仮称) スキーマ手習いの eq?-c が動くようになった。

MyLisp(仮称)の作成中。です。 https://github.com/moremagic/MyLisp/wiki lambda が二回続けてくるなんて想像もしてなかった。 結構悩んだ挙句、lambda 周りの処理を大きく修正。lambda が出現したときのみ環境変数から展開するといいのかな。 applyだけし…

MyLisp(仮称) で no-nums がやっと動いた。

MyLisp(仮称)の作成中。です。 https://github.com/moremagic/MyLisp/wikiScheme手習いの no-nums がどうも動かなかったのでずーっと悩んでました。 ※ 2,3日ほっといたのは内緒w isNumber? の評価前にapplyしていないのが原因でした。 public Sexp eval(…

quote対応完了

多分これで大丈夫なはず。

Lisp処理系をじっそうちゅ。

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,>…