Jun Inoue
jun.l****@gmail*****
2005年 8月 15日 (月) 20:16:06 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 にしました。 で、その部分をいじってて思ったんですが、「引数を評価せずにリストとして渡 される関数型」ってあった方がよかないですか? みたところ lambda, set, delay, quasiquote, unquote, unquote_splicing, define が該当します。ある いは、「引数を評価せずにもらう、必ず末尾再帰な関数」。これは if, cond, case, let, let*, letrec, begin, do が該当します。 以前 FUNCTYPE_R で統一したのは、処理の流れが直観的にわかりにくいので型を 増やして混乱させたくないという理由だったと思うんですが、むしろ「なんでこ の関数に tail_flag があるの、何かに使うの?」というプロトタイプが増えて、 逆にどうかと思うんですが。 ;; それにすぐ tail_flag セットし忘れるし… 型 ID の宣言の横にちゃんとコメントを書いておけば処理の流れがわからないと いう混乱は十分防げると思います。 -- Jun Inoue jun0****@users***** -------------- next part -------------- 文字コード指定の無い添付文書を保管しました... 名前: sscm-qquote.diff 下載