Etsushi Kato
ekato****@ees*****
2004年 3月 8日 (月) 12:53:03 JST
こんにちは。 On Fri, Mar 05, 2004 at 06:23:24PM +0900, TOKUNAGA Hiroyuki <tkng****@xem*****> wrote: > 了解です。あと、今さっき決心を固めまして、とりあえずromaja.scmと > pyunihan.scmあたりを遅延読みこみさせるように変更しておきます。 まだ、romaja.scm が loader.scm に残っているようです。いずれにせよ、 -s200000 だと、Mac OS X では tutcode.scm でスタックが足りなくなってし まうようです。 そこで少し調べてみたところ、siod の lreadparen を再帰ではなく繰返しに すればスタックをたくさん使わずにすみそうなので、変更してみました。結果、 Mac OS X でも -s200000 で OK になりました。また、romaja.scm とか、 pyunihan.scm を loader.scm に含んでも大丈夫です。 http://cvs.sourceforge.net/viewcvs.py/*checkout*/emu/speech_tools/siod/slib.cc?rev=1.1.1.2 から持ってきたものですが、どうでしょうこれ? ところでインデントは揃えたつもりですが、どうやったら slib.c のように 書けるのでしょうか? vim では大変でした… -- Etsushi Kato ekato****@ees***** -------------- next part -------------- --- uim-0.3.2/uim/slib.c.orig Sun Mar 7 20:59:35 2004 +++ uim-0.3.2/uim/slib.c Mon Mar 8 12:16:51 2004 @@ -905,6 +905,7 @@ return (my_err ("token larger than TKBUFFERN", NIL)); } +#if 0 static LISP lreadparen (struct gen_readio * f) { @@ -926,6 +927,45 @@ } return (cons (tmp, lreadparen (f))); } +#else +/* Iterative version of the above */ +static LISP +lreadparen (struct gen_readio * f) +{ + int c; + LISP tmp, l = NIL; + LISP last = l; + + while ((c = flush_ws(f, "end of file inside list")) != ')') + { + UNGETC_FCN (c,f); + tmp = lreadr (f); + if EQ + (tmp, sym_dot) + { + tmp = lreadr (f); + c = flush_ws (f, "end of file inside list"); + if (c != ')') + my_err ("missing close paren", NIL); + if (l == NIL) + my_err("nor car for dotted pair", NIL); + CDR (last) = tmp; + break; + } + if (l == NIL) + { + l = cons (tmp, NIL); + last = l; + } + else + { + CDR (last) = cons (tmp, NIL); + last = cdr (last); + } + } + return l; +} +#endif static LISP readtl (struct gen_readio * f)