scheme

今日の「今更気付いた事」

スタックはFILOの性質を持つので、単方向リンクリストで実装すべき。 そうすれば、(スタックに保存される情報がimmutableであるという前提ならば)スタック自体もimmutableになるので、call/cc(もしくは類似の用途)の為にスタックを非破壊的かつ低コストで保…

高階関数クイズをやった

これ。 http://d.hatena.ne.jp/camlspotter/20100710/1278752186 unlambdaとかlazy k(というかコンビネータ論理)を思い出した。 以下は答えそのものじゃないけど、思考手順が書いてあるので見たくない人はみない事。

今日の結論: あんまり役に立たない。 某所で「特定範囲内の乱数を重複せずにn個取得する」のに、「重複したらもう一回乱数を取得する」以外にスマートな方法は無いのか、という話が出てたので、なんとなくGaucheでやってみた。 (尚、「結果の乱数リストの順…

nucさんのcall/ccクイズ

最近はずっとやる気がない。 かなり前に、 http://d.hatena.ne.jp/nuc/20080406/p4 これに挑戦して、途中まで解いたメモが残っていたので、一応、最後まで解いてみた。 (以下、自力で解いてみたい人はネタバレ注意)

「安全なeval」別解

実は、「安全なeval」には、「(可能なら、別サーバかつ)別プロセスでgoshを起動し、そこにS式を流し込んで評価させる」という、結構シンプルな別解がある。 (別プロセスの方が死んだり、応答がなかったら「失敗」扱いにするという事になる) 実際、S式バトラ…

GC_oom_fn対策(1)

今回の結論: 月曜ぐらいからコード書く。 これまでの流れ: 「安全なeval」を作りたい 「安全なeval」では、evalが過剰にメモリを消費しても、evalの親に影響を与えない必要がある 例えば、evalのメモリ過使用に巻き込まれて、eval元がプロセスごと死んだりし…

eval/memlimitについての内容をちょっとまとめた。 http://e.tir.jp/wiliki?eval-sv%3aeval%2fmemlimit

直した。 (use eval-sv) (use gauche.parameter) (use util.list) (define-values (eval/sv env) (make-eval/sv :isolate-port? #f)) (define start-size (make-parameter #f)) (define runup-size (make-parameter 0)) (define limit-size (make-parameter …

さっきの問題を調べ直した。 どうやら、二回目以降のeval/memlimitでは、dynamic-windのbefore thunk内の(gc)では、まだメモリが解決されないが、実際のeval/svに突入した段階で(gc)すると、メモリ使用量が確かに回復するようだ。 おそらく、副作用(current-…

昨日の続き。 dynamic-windを使えば、昨日の 他の問題点としては、S式バトラーのように、複数のevalを同時に起動して、継続を使ってコルーチン的に動きまわるような場合には、正常にメモリ使用量を取る事が出来ない。 を一応、解決できる事に気付いた。 (但…

厳密でなくてもいいなら、eval/svと(gc-stat)を使えば、擬似的にメモリ使用量を制御できる事に気付いた。 (use eval-sv) (use gauche.parameter) (use util.list) (define-values (eval/sv env) (make-eval/sv :isolate-port? #f)) (define original-size (m…

今日の要約: 俺Lispに必要な仕様がまとまってきた。実際に作るかどうかは未定。しかし、カッコ良い名前を考えておく事。 http://d.hatena.ne.jp/ranekov/20080403/1207163582 http://d.hatena.ne.jp/ranekov/20080228/1204186771 http://d.hatena.ne.jp/rane…

call/ccパズルをeval-svで解いて?みた。 http://e.tir.jp/wiliki?eval-sv%3a%a5%b9%a5%c6%a5%c3%a5%d7%bc%c2%b9%d4 今思うと、S式バトラーよりも、こっち(call/ccパズルみたいな問題をステップ実行で解かせる)をgauche.gongの出し物にした方がウケが良かっ…

「はてなようせいとまなぶ R5RS表示的意味論」を読んだ。 http://lambda.bugyo.tk/hatena/r5rs.html はてなようせいがちーちゃんに見えてきた。 ググれ!

ステップ実行eval開発中(9)

internal defineも正常に機能していない事に気付いた。 ちゃんとtest caseを書かないと駄目だなあ。 defineは、トップレベルで呼ばれた時と、let等の内部で呼ばれた時とで挙動が違う。 これは、defineの内部で、トップレベルで呼ばれたのかlet等の内部で呼ば…

ステップ実行eval開発中(8)

quasiquote内の、unquoteとunquote-splicingが正常に動作していない事に気付き、しばらくはまった。 (Gaucheの)quasiquoteは、内部のunquote、unquote-splicingを、シンボルでのみ判定しており、その実体が何かという事については気にしていないという事を知…

ステップ実行eval開発中(6)

隠し束縛を安全に隠す方法を思い付いた。 (gensym)を使って、文字列からは変換不可能なシンボルを生成する 対象モジュール内で、このシンボルに対して、隠したい内容(今回はspecial formの実体)を束縛する このシンボル内の束縛にアクセスする為には、元のシ…

ステップ実行eval開発中(5)

WiLiKiに書いた。 しかし……これって、ものすごくR5RS外だよなあ、あんまり突き詰めるような部分じゃないよなあ、移植性ないよなあ、とも、書きながら思ってしまった。 mzschemeで追試したら、mzschemeではそもそも、special formやmacroの実体に、(即値風に)…

ステップ実行eval開発中(4)

できた。eval拡張パッチが。 さっきのコメントは、((lambda () ...) ...)のような、car部分がlistになってるものについてだった。気にしなくてよかった。 R5RSのevalの項目も確認した。 expression は,データとして表現された一つの妥当な Scheme 式でなけ…

ステップ実行eval開発中(3)

http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3AYAGHG%3AIntroduction#H-1l0p7af 回り道したが、これを発見した。凄い有難い。 で、問題のコードはcompile.scmのpass1のところにあった。 evalの第一引数のlistの先頭が何なのかをpass1/lookup-head…

ステップ実行eval開発中(2)

要は、 ((eval `(,lambda (arg) arg) (interaction-environment)) 123) => 123 のように、evalに対して、マクロやspecial formの「実体」を渡した時にも、evalがそれをマクロやspecial formとして扱ってくれれば問題は解決するのだが、とりあえずGaucheはそ…

ステップ実行eval開発中(1)

とりあえず手続き類は問題無く動くようになった。 しかし、マクロとspecial formの評価時に割り込み処理を入れるのが難しい。 マクロとspecial formには割り込み処理を入れない事にすると、当初に想定していた利用方法の大半が駄目になってしまう為、この部…

ステップ実行evalが欲しい

インターフェースは以下のような感じ(仮)。 (with-step-eval expr env step-num interval-proc) exprとenvは、通常のevalと同じ。 step-numに、「何ステップ分実行したらinterval-procを呼ぶか」のステップ数を設定。 「ステップ」は、例えば、(car (cons 1 …

S式が必要な理由 / Schemeでは足りない部分

今日は考えながら書くので、結論は一番最後。 関数指向言語は色々あるものの、自分はどうしてもS式ベースの書式を持った言語を選ばざるを得ないようだ。 その理由を色々と考えてみた。 その結果は、自分が、究極的には「コードを生成するコードを書いて、あ…

バックトラックポイントの生成をマクロ化してみた

さっきの文章を書いていて、この用途で使うcall/ccを汎用化できそうな気がしてみたので、ちょっとマクロ化してみた。 let1とlet/cc使ってるのでgauche用だが、そこを展開すれば他のschemeでも使えると思う。 (define-syntax backtrack-point/values (syntax-…

継続による時間操作まとめ

前回までのフィラデルフィア・エミュレータ作りで考えた事の要約。 まだ考え途中。 以下の文章で使っている「call/cc」は、よくあるgotoやreturnの用途で使うcall/ccではなく、 (call/cc (lambda (cont) ... ... ...)) xxx xxx xxx の、「...」の外側(「xxx…

継続による時間操作とフィラデルフィア・エミュレータ(4)

ちょっとコードを考え直してみたが、完全にcps変換してしまわない限り、closure-ambは使えない事に気付いた(手続きの呼び出しで戻ってしまうと、amb状態が戻されてしまう為)。 どうするか。 部分継続を使えば何とかなるかも知れない。しかし、駄目かも知れな…

継続による時間操作とフィラデルフィア・エミュレータ(3)

要約: フィラデルフィア演義の戦闘エミュレータが、とりあえず動くようになった。

継続による時間操作とフィラデルフィア・エミュレータ(2)

要約: 副作用無し(と言うにはかなり怪しいが)で実装されたambを二種類、作った。

継続による時間操作とフィラデルフィア・エミュレータ(1)

要約: フィラデルフィア演義の戦闘エミュレータを作り始めた。まだちゃんと動かない。 その過程でambを作り直し、時間属性を持つオブジェクト操作に関するバッドノウハウを収集した。