syntax-rules

そういえば

SYM_ELLIPSIS が scm_intern("...") のままだよ… Compiler にこれが純粋関数 (i.e. 副作用無し) だと見抜けるわけはないので、FOR_EACH() とかの loop 内で毎回 hash lookup 呼んでる事に… Compaction 終わったら速さを測り直してみよう。(まあそれが非常に…

stress test

STklos は (require "full-syntax") したら通った。16 秒。実装は scheme っぽいので、scheme で書くと高くつくかもと言ったのはちょっと早まったか。まだ order が一つ違うけど Scheme48 のように悲惨な結果にはなってない。この場合 16 倍を多いと見るか、…

↓Memory 使用量も調べたいなあ…。Shell の `time' builtin みたいに手軽にできるんだろうか。

この expander なかなか優秀ではないか。Transcribe した後の symbol lookup はちょっと遅いけど、expansion そのものは Oleg Kiselyov の stress test を基準に言えば高速な部類に入るらしい。試してみた範囲では Guile, Gauche, Bigloo, STklos → error (b…

面倒見てもらえないのか…

jun@debian /tmp $ cat tmp.c int f(int o) { return (o & 6) == 6 && (o & 8) == 0; } jun@debian /tmp $ gcc -O3 -S -o - tmp.c .file "tmp.c" .text .p2align 4,,15 .globl f .type f, @function f: pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx movl …

compaction support 進行中

んー、なんか色々効率悪 *そうな* 箇所があるなあ。Compiler の最適化がどれぐらい効くかで評価が思い切り変わるけど。 その1 (確実) #define SCM_CONS_CAR_VAL(a) ((ScmObj)(SCM_CELL_CAR(a)))Cons の tag 00 にしてる意味ないしそれ。orz 2 #define SCM_SA…

orz

↓すっげーアホな bug だった。手元の処理系全部 fail させて結構 maniac な test も揃ったかなとか天狗になってたら、どれも maniac 過ぎて基本的な部分が test できてなかったオチ。

件の stress test が何故 fail するのかまだわからず。っていうかこれ追うんですか…マジですかそうですか。

A dark, under-specified corner of R5RS: VCELL を使う限り 3 を出すのは無理だな…あるいは farsymbol が 2 cell 使うか。気色悪い事したら 3 出せるね。 (define sym val)Top-level define に渡される symbol についてる wrapper は高々 1 個 (のはず) な…

どひー

本当の stress test。Gauche と STklos は error, Guile は stack overflow, Scheme48 は返ってこない + ^C して止めたらバグた。 Sigscheme は何故か macro の引数を評価しようとして error を出す。マジで? その下の dark under-specified corner も asser…

たいへんよくできましたなことになってます

Deeply nested ellipses の test の深さが足りてないことに気づいたので、もっと深い奴を追加したところ、Guile がS t a c k o v e r f l o w で 諦 め よ っ た。これにて test-syntax-rules.scm の test (assert-error のもの除く) が全部通るのは STklos …

進捗状況

FAILED: 1 tests, 38 assertions, 23 successes, 15 failures, 0 errors Symbol を返すものが全て比較失敗のせいで failure に数えられてるので、いきなり 15 というのは予想よりずっと少ない。 にしても 38 か…。もっと多いと思ってたけど、まあこんなもん…

間違い探し

expected: <((()) ((((((((((((((((((((((1 2) (1 2)) (() ()) (#(3) #(3)) (4 4) (5 5) 0)))))))))))))))))))) #(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(((1 2) (1 2)) (#(3) #(3)) (4 4) (5 5) 0)))))))))))))))))))) mismatch mismatch mismatch mismatc…

symbol lookup algorithm

うーむ、これさえできれば後は完成まで単調作業だけなんだが… どうもうまい実装を思いつかない。 Shiro さんが「効率を落とさずに実装する方法を考えて早幾年」と言ったのはここの部分の事。とは言え Gauche では data 形式にまだ工夫の余地があるのかも知れ…

思いっ切りはみ出し

ある種 stress test? MIT/GNU Scheme と Scheme 48 では error になる。Gauche, Guile, STKlos では通る。SigScheme は現在 symbol lookup が不適切なので assertion failure が出る。Debug dump を見る限り expansion は問題なく行われている様子。 (let-sy…

あっ

Macro の実装って TR_* series が 使 え な い ( ゚д゚)……あの interface 策定の苦労は一体…

うーむ、しかしデカいな、macro.c。色々妥協しまくったから 5〜600 行で済むかと思ってたけど、1000 行は超えそうぢゃ。

ScmObj scm_p_reversed(ScmObj ls);ぃややこしい。 こうなるから "!" の表現は d じゃなくて x にした方が良いって言ったのに。...。言ってなかった orz まあいいや。

やっとちょっとやる気が出てきたのでガリガリ進めてるですよ。でも凝り性 *など* (←重要)が災いして進行速度は人並以下ですよ。春休み中に終わるかしら。とりあえず本日の無駄時間: ((a b ...) ...)というpatternに ((0 1) (2 3 4) (5) (6 7))というのを食べ…

Ellipsis の実装

Guile source の psyntax.ss に debug-print を仕込んで追ってみたところ、Gauche の algorithm と殆ど違いが無いことがわかった。

Corner case 地獄その4

(let-syntax ((macro (syntax-rules () ((_ (a ...) ...) '(a ... ...))))) (macro (0 1) (3 4))) --> Compile error (Gauche, STklos, MIT/GNU Scheme) --> (0 1 3 4) (Guile, Scheme48)…能率あがらなーい。やる気が出ないわけではないし、方針も固まってる…

Corner case 地獄その3

(let ((... 0)) (let-syntax ((macro (syntax-rules () ((_ a ...) '(a ...)) ((_ . x) #f)))) (macro 0 1 2))) ==> #f [Guile/Chez, STKlos] ==> (0 1 2) [Gauche, Scheme48]

Corner case 地獄その2

…と思ったけど (もっと大きな test の一部だったので)、どうもただの gauche の…バグ? でもないのか。やっぱりバグと判断したので Wiliki に移動。固定 link 機能が欲しいな。

Corner case 地獄その1

思わず↑「その1」とか書いてしまうあたりがもうorzMacro の template 内で束縛されて改名された識別子を一旦 vector を通して submacro に渡してみる: (let ((x 'outside)) (let-syntax ((foo (syntax-rules () ((_) (let ((x 'inside)) (let-syntax ((bar (…