Kazuki Ohta
mover****@hct*****
2005年 8月 16日 (火) 04:04:28 JST
太田です。 > quasiquote の実装がやっとこさできました。ネストと vector splice に対応し > ています。ただし、vector 内では評価の順がぐちゃぐちゃです。後ろから > splice するやつだけ拾って評価していって、その後今度は前から順に splice > しないやつを評価していきます。 > > 基本的に Scheme は評価順を保証しないのでこれでいいと思いますが、どうして > も左→右順に評価させたいのなら言ってくだされば書きます。変更は小さいです > がメモリ使用量が増えるので見送っただけですので。 > > それに伴って以下の変更・バグ潰しをしてあります。 > > ・quote 類の内部表現を (#<quote> . x) から (quote x) に変更 > ・quote 類を FUNCTYPE_R に変更 > ・equalp の ScmEtc の扱いを修正 > ・eval の ScmEtc の扱いを修正、(() x) とかでエラーを出すようになった > ・SCM_CAAR その他追加 > > 一つ目について補足: > quote 式の car は symbol であると 6.3.2 で定められているので、quote は > ScmOp_quote() にバインドされた symbol にしました。 有難う御座います。まだ詳しくパッチを見ていないのですが、test-r4rs.scmで一件 テストがfailするのと、test-quote.scmで無限ループに陥っているようです。それぞれ のメッセージは以下の通りです。 * test-r4rs.scm errors were: (SECTION (got expected (call))) ((4 2 6) (((foo 7) unquote (car (quote (cons)))) ((foo 7) . cons) (quasiquote ((foo 7) unquote (car (quote (cons))))))) * test-quote.scmのバックトレース (gdb) bt #0 0xb7efde77 in mallopt () from /lib/tls/i686/cmov/libc.so.6 #1 0xb7efdd44 in mallopt () from /lib/tls/i686/cmov/libc.so.6 #2 0xb7efcc83 in free () from /lib/tls/i686/cmov/libc.so.6 #3 0xb7fcf511 in finalize_heap () at datas.c:293 #4 0xb7fcf134 in SigScm_FinalizeStorage () at datas.c:182 #5 0xb7fe4cb3 in SigScm_Finalize () at sigscheme.c:311 #6 0x08048951 in main (argc=2, argv=0xbffff7d4) at main.c:105 test-quoteの方は何か違う問題臭いのですが、一応確認頂けますでしょうか? test-r4rs.scmの方のテストは指摘したモノ意外はパスしていて、素晴らしいです! 評価順序については、今のままで良いと思います。問題が露呈した場合に対処し ましょう。 > で、その部分をいじってて思ったんですが、「引数を評価せずにリストとして渡 > される関数型」ってあった方がよかないですか? みたところ lambda, set, > delay, quasiquote, unquote, unquote_splicing, define が該当します。ある > いは、「引数を評価せずにもらう、必ず末尾再帰な関数」。これは if, cond, > case, let, let*, letrec, begin, do が該当します。 > > 以前 FUNCTYPE_R で統一したのは、処理の流れが直観的にわかりにくいので型を > 増やして混乱させたくないという理由だったと思うんですが、むしろ「なんでこ > の関数に tail_flag があるの、何かに使うの?」というプロトタイプが増えて、 > 逆にどうかと思うんですが。 > > ;; それにすぐ tail_flag セットし忘れるし… > > 型 ID の宣言の横にちゃんとコメントを書いておけば処理の流れがわからないと > いう混乱は十分防げると思います。 もちろんそれでも良いんですが、適切な名前を思い付かないのですよね...説明を書けば 良いとは思うのですが、説明なんてきちんと読まれる訳が無いので適切な名前を付けた いんですよね。ので、良い名前が有れば変更します。 -- ------------------------------------------------- Kazuki Ohta : mover****@hct***** -------------------------------------------------