投稿
ちーたけ hello.world256
オイラは今Lisp処理系をプチっているのですが、静的スコープでGCを実装する方法がよく分からんとです。 どうか知識豊富な皆様の知恵をお貸しください。
3そうだね
プレイ済み
返信[1]
親投稿
れい rei-nntnd
LISPキタ。 静的スコープならスコープ出るときにゴミ収集すればいいだけなんで楽なんではないの? 難しいことはないように思えるけども。
0そうだね
プレイ済み
返信[2]
親投稿
けい kei0baisoku
オブジェクトに参照カウンタを持たせて、0になったら解放とかではなくてですか? ちょっと面白そうなので首を突っ込んでみましたが、見当違いでしたらスルーしてくだせぇ(´ω`)
0そうだね
プレイ済み
返信[3]
親投稿
ちーたけ hello.world256
オイラが前作ってた動的スコープのLispでは、gc[]に true/false を入れといてgc()が呼ばれたらenvをtrueでマークする、getnewcell()みたいな関数はGC[]がtrueじゃないcellをゲットだぜ!! みたいなノリの実装で、今回の静的スコープを持つLispでもそれを実装しようと思っていたのですが、実装出来ず苦しむ毎日なのです。 '(この手法だと無駄cellを回収する手間や時間が省けるので素敵、だがオイラオイラ考案&実装なので他人に説明しにくい)
0そうだね
プレイ済み
返信[4]
親投稿
れい rei-nntnd
gc[]のtrue/falseがGCされたかどうかのフラグということかな? なら、そのフラグを確保する配列に「スコープ」の情報を持たせたらいいでしょ。 例えば… gc[]と同じ長さのgcscope$[]を用意して、getnewcellで確保されるたびにそのスコープ名を入れておく。 スコープ名はグローバルなら空文字、関数なら関数名+通し番号みたいな感じで定義して。 入れ子のスコープなら「親スコープ名+"/"+子スコープ名」みたいな感じで。 で、gc(scopename$)みたいに拡張して、gc()内でgcscope$[]の全要素を前方一致を検索してまとめて廃棄。 みたいな。 セル増えてくると検索大変だからデータ構造に工夫が必要になるけども。
0そうだね
プレイ済み
返信[5]
親投稿
ちーたけ hello.world256
あー、えっとですね、GC[]に入ってるt/fは現在そのcellが使用されていてnewgetcell()で取得しちゃダメかどうかというフラグで、どちらかと言えばGC[]はNotuseflag[]みたいな役割です。
0そうだね
プレイ済み
返信[6]
親投稿
ちーたけ hello.world256
あ、twitterやってるならDMで公開キー送りますよ。
0そうだね
プレイ済み
返信[7]
親投稿
れい rei-nntnd
それでも論理が逆になるだけで同じかな。 スコープを区別できるように情報を一つたせばいいだけ。
0そうだね
プレイ済み
返信[8]
親投稿
ちーたけ hello.world256
わっかりまつたけー。 ちょっと実装してみようと思いまーす。
0そうだね
プレイ済み