Gauche:WishList:done
Gauche:WishListに書かれたもので、対応済みのもの
- file.lock みたいなモジュールが欲しいです
- 全角空白も空白として認識しては?
- rfc.ftpの、ftp-set-typeをexportしてほしい
- <parameter>でも setter が使えるようにしてほしい
- call-with-client-socket でバッファリングを指定したい
- provideの引数を省略可にする
- gauche.netで、SHUT_RD, SHUT_WR, SHUT_RDWR を定義して欲しい
- srl:sxml->xml に多くの要素を含むツリーを渡したい
- クロスコンパイルでバイナリを作成する
- Base64 エンコーディングに改行を含めないオプションを追加する
- 正規表現のwriteで'/'をクオートして欲しいです
- Large file support
- regexp-replaceでも、名前によるバックリファレンスが使いたい
- SchemeからScm_TreeCoreClosestEntriesを使いたい
- setrlimit, getrlimit
- 2038年問題
- sys-environが欲しいので、作ってみた
- リストのシャッフル
- process-output->stringにキーワード引数を渡せるように
- define-methodからオートロードしてほしい
- hash-table-clear!
- ftp-put-unique で作成したパスを取得したい
- configure実行時のオプションを最後に表示する
- uri-encodeに:escapeを、uri-encode-stringに:encodeを
- 無限ループ時のシグナル処理
- <rational>クラス
- gauche.netにSOMAXCONNが欲しい
- make-server-socket(s)にbacklogを渡したい
- 新DBI層で定義されたdbi-execute-queryではSQL文をパラメタライズしたくない。
- debug-printの情報表示を拡張
- Mingwでもドライブレター認識
- sys-sigmaskで現在のシグナルマスクを取得したい。
- クラスを再定義した場合、総称関数の呼び出し時にもインスタンスの更新を行って欲しい
- 組み込みクラスの equal?
- 正規定義
- 乱数発生源の初期化
- 仮想バッファポートの内部バッファサイズを変えたい
- errno
- 展開時に無限ループに陥るようなマクロを書いてしまったとき、エラーを出してほしい。
- genstubに<cstring>, <cstring-const>...を入れてほしい。
- srfi-1のfoldとgauche.collectionのfoldが衝突してしまうのを何とかして欲しい
- クラス名(シンボル)からクラスオブジェクトを得る関数
- read-string!
- file.util の make-directory* で pathname 末尾の "/" を許して欲しいです
- 正規表現同士のequal?
- リファレンスマニュアルの永続的なURL
- stable-sort
- hash-tableのobject-apply
- www.cgiのget-meta関数もexportしてほしい
- PostgreSQL対応
- gauche-character-encoding の返り値の型
- 正規表現の「単語の先頭/終了へのマッチ」
- port.* Portability libraries
file.lock みたいなモジュールが欲しいです
gauche.logger にある lock-file, unlock-file を汎用的にしたようなモジュールが
あると便利かなと思うのですがいかがでしょうか. --nakamura(2004/07/31 11:10:56 PDT)
- Shiro(2011/07/26 01:40:11 PDT): 0.9.2のfile.utilに
with-lock-file
というのが入ります。
全角空白も空白として認識しては?
Shiro:UnixUser0307のSetu?さんの書き込みより:
Setu?: ここに置いてあるサンプルのコードをコピペして動かしたら、動かないので焦った。
リストを見ても絶対に間違いはなさそうだし、テストするのに行をコメントアウトしたり、print して見たり、最後にこれを見た時には、うちの gauche を疑った(ごめん):.... yearは2004が入っている。 (print (quotient year 4)) .... *** ERROR: unbound variable: printえ?で、これを更に削るの?って削ろうとしたら、マウスで空白を選択しようとした時に、変な物が見えた気がした。そうだったのだ、このリストでは空白が全角の空白だったのでした。サンプルコードが<pre>で囲んでなくて、うまくページに出来なかったので空白を全角にしてごまかしたんじゃないかと思います。
関連して思ったのは、gaucheでの全角空白の扱いを半角の空白と一緒にしたら良いんじゃないかなと思いました。これは、バグか要望に書いた方が良いのかな?-- 2004/08/21 00:34:06 PDT
Shiro(2004/08/21 04:13:57 PDT): なるほど。日本語の全角空白以外にもUnicodeで空白とされている 文字はいくつかあったと思うので、readはそれらを全部whitespaceと見なす、 としてもいいかもしれませんね。全角空白一文字のシンボルとか作られると 大変だし。
- Shiro(2011/07/26 01:40:11 PDT): これは結構前に対応済み。
rfc.ftpの、ftp-set-typeをexportしてほしい
gemma(2009/04/10 23:38:51 PDT): ProFTPDが、SIZEコマンドをASCIIモードでは受け付けない仕様になっているので、ftp-set-typeを使いたいです。
- Shiro(2009/06/01 03:43:53 PDT): これはむしろ、SIZEコマンド発行時にも<ftp-connection>の trasnfer-typeに合わせたTYPEコマンドを発行すべきかなという気がします。 他のコマンドでもTYPEはimplicitに発行されますから。 (ftp-set-typeを呼べたとしても、他のコマンド発行時にimplicitにTYPEが発行されて transfer-typeが変わってしまうことがあるので、動作がわかりづらいんじゃないかと)。
- Shiro(2009/06/01 05:05:44 PDT): というわけでそのようにfixしました (rev6684)。 他にftp-set-typeを直接呼びたいケースがあれば教えてください。
<parameter>でも setter が使えるようにしてほしい
koguro(2010/03/05 22:03:29 PST): 現状 <parameter>に対して push! などを使うとエラーになります。問題なければ <parameter>オブジェクトにも (setter object-apply) を定義してほしいです。
gosh> (define a (make-parameter '())) a gosh> (a) () gosh> (push! (a) 1) *** ERROR: invalid application: (#<<parameter> 0x10106fdc0> (1)) gosh> (define-method (setter object-apply) ((obj <parameter>) value) (obj value)) #<generic |setter of object-apply| (1)> gosh> (push! (a) 1) () gosh> (a) (1) gosh> (push! (a) 2) (1) gosh> (a) (2 1)
- Shiro (2010/11/20 23:08:54 PST): 対応しました。0.9.1に入ります。
call-with-client-socket でバッファリングを指定したい
び(2009/05/20 02:52:50 PDT): 標題の通りです。procの中でport-bufferingにset!するのも不細工なので。
- Shiro(2009/06/01 03:28:36 PDT): done.
provideの引数を省略可にする
以前にもprovideの引数の話題があがっていましたが、いっそのこと引数を省略できるようにしてしまえないでしょうか? requireしたときの名前を記憶しておいて、引数なしのprovideが現れたら先の名前を使用するようにするというのはどうでしょう。--koguro(2005/11/06 03:17:14 PST)
- Shiro(2005/11/06 03:27:15 PST): あ、それは面白い。ロードされているファイル自身は
自分がどのrequireによってロードされているかを(内部的には)知ってるはずですね。
もひとつすすめて、provideが無くてもrequireによるロードが正常終了したら 勝手にprovideしちゃったらどうなるだろう。provide自体は、自分自身以外を provideするようなトリッキーな用途に残して置くとして。 - koguro(2005/11/06 04:19:50 PST): provide自体を省略できるようにするのはいいですね。ただ、そこまですると今の仕組みに比べて自由度が下がりますが不都合はないのでしょうか?(例えば、ある条件を満たしたときのみprovideするみたいなことができなくなる)。私自身はこんな使い方をしたことないのでprovide自体を省略できるようにするのは賛成なのですが。
- Shiro(2005/11/06 04:27:05 PST): そういう特殊な使い方の方が珍しいので、 例えば(provide #f)なんかでautoprovideをオーバライドできるようにしとけば いいんじゃないかという気がします。
- Shiro(2008/11/22 16:40:17 PST): このアイディアを実装しました。(rev6477)。
gauche.netで、SHUT_RD, SHUT_WR, SHUT_RDWR を定義して欲しい
び(2008/04/21 20:38:57 PDT): socket-shutdown の第2引数(how)を即値で指定するのは間違いやすい(というかわたしは間違えました)ので、SHUT_RD、SHUT_WR、SHUT_RDWRを定義して欲しいです。Posix 1gには含まれているそうです。手許でも、Fedora 8、NetBSD 3.1_STABLE/4.0_STABLE、FreeBSD 7.0R、Mac OS X 10.5 では使えることを確認しました。
- Shiro(2008/10/04 04:00:40 PDT):対応しました (rev6394)。
srl:sxml->xml に多くの要素を含むツリーを渡したい
tabe(2007/12/17 00:54:53 PST): 多くの要素を含むツリーを渡すと
*** ERROR: too many arguments (284434) to apply Stack Trace: _______________________________________ 0 (srl:sxml->xml result) At line 89 of "./foo.scm" ...
のように apply に渡せる引数の個数の上限に引っかかります。 srl:sxml->xml のなかで呼び出される srl:apply-string-append を変えればいいようです。 (コメントアウトされている Chicken 向けのコードと同じようにする?)
- Shiro(2008/01/03 23:29:37 PST): 次のリリース(0.8.13)でapplyに渡せる引数の個数の 制限がほぼ無くなるので、大丈夫かと思います。 (「ほぼ」というのは、(apply proc 0 1 2 3 ... 20000 '()) のように引数を直接 並べた場合は引っかかるので。しかしリストになっている引数を渡す場合は、 必要なぶんしかスタックに展開しないようになりました)。
- tabe(2008/01/05 07:38:03 PST): 了解です。年末に根本的な解決をありがとうございます。
- Shiro(2008/10/04 04:00:40 PDT): 対応済みにつき移動
クロスコンパイルでバイナリを作成する
YOKOTA Hiroshi(2007/11/25 13:32:03 PST): 現在の MinGW バイナリは構築時に Cygwin も必要とするなど準備が面倒なのでUnix上にクロスコンパイラを用意してそちらで構築するようにしてみました。
- Shiro(2007/11/25 14:38:48 PST): ありがとうございます。分量が多いので Gauche:CrossCompilationに移します。
- Shiro(2008/10/04 04:00:40 PDT): 対応済みにつき移動
Base64 エンコーディングに改行を含めないオプションを追加する
tabe(2007/12/06 21:44:09 PST): RFC 3548 の2.1に書かれているような、エンコードされたデータに 改行を含めないオプションが欲しいです。下は案のパッチです: (コメントアウトしました)
- Shiro(2007/12/07 01:25:51 PST): なるほど。むしろ行の長さを指定するオプションをつけて、 デフォルトを76にしとけばいいかな。そんで0または#fで折り返し無しにすると。
- tabe(2007/12/07 04:41:04 PST): 確かにその方が一般的でいいですね。というわけでパッチを変更してみました。
- Shiro(2007/12/07 19:25:44 PST): ども。せっかくなので任意のカラム数 (>0) で改行 できるようにしました。
- tabe(2007/12/08 08:12:05 PST): なるほど、おっしゃる通りですね。ありがとうございます。 (実は RFC2617 の認証を実装しようとして要望してみたのですが、見抜かれたように CVS HEAD の rfc/http.scm に動きがあって嬉しい驚きでした。)
- Shiro(2007/12/08 22:58:40 PST): 私も少し前からrfc.httpに手をつけてたので渡りに船だったのでした。 http.scmはまだチェックインするつもりじゃなかったのをうっかり一緒にcommitしてしまった だけなんですが、作業が重ならずに良かったです。
正規表現のwriteで'/'をクオートして欲しいです
以下、実行例 --hira(2004/05/31 23:50:00 PDT)
(string->regexp "http://www.hoge") ;=> #/http://www.hoge/ (((string->regexp "http://www.hoge") "http://www.hogefuga")) ;=> "http://www.hoge" (regexp->string (string->regexp "http://www.hoge")) ;=> "http://www.hoge" ;((#/http://www.hoge/ "http://www.hogefuga")) ;*** ERROR: unbound variable: /www.hoge/ ((#/http:?/?/www.hoge/ "http://www.hogefuga")) ;=> "http://www.hoge"
- これは、どうかなぁ。
当然 #/.../ というところで "/" が特殊な文字だから、その中の "/" を特別扱い
するのも分かる気がしますが、たとえば、上記で "." はエスケープしないでいいか?
と言われたらどうします?
gosh> ((#/http:?/?/www.hoge/ "http://wwwXhogefuga")) "http://wwwXhoge"
これはやっぱり、 regexp->string に渡す前にある程度自分で エスケープしたいやつをエスケープすべきかと思いますよん。
逆に、上記を見て、じゃぁメタキャラクタは全部分かってるんだから メタは全部エスケープしようよってのは当然ダメっすよ。 本当にメタキャラクタを埋め込みたい時に困るんで。 自分でエスケープしたいものをエスケープした文字列に変換してから渡すってのが こいつの正当使い方になるかと。
でも少なくとも "/" は間違い無く困るじゃんって? そりゃそうだ。(^^;自分ツッコミcut-sea:2004/06/01 04:21:50 PDT
- ああ、すんません。例がまずかったかも。問題はreadとwriteが対応しないってとこです。
(read-from-string (write-to-string (string->regexp "http://www.hoge"))) ;=> #/http:/
とりあえず、この問題はstring->regexpするときに'/'をエスケープすれば回避できます。 でもこれじゃ使いにくいので、願かけてるというわけです。--hira (2004/06/01 05:00:08 PDT)
- Shiro: hiraさんの要望の趣旨は理解しました。regexp objectのwrite表現が #/.../ と外部表記に合わせてあるんだから、writeしてreadできるのが自然ですね。 これ、昔ちょっとひっかかった覚えがあるんだけれども忘れてました。 で、'/'をエスケープするだけならすぐできる、と思って手をつけたんですが、 完全なwrite-read同一性を保証するにはそれだけではダメなことが判明したので、 今思案してるところです。
- Shiro(2007/11/20 04:57:53 PST): ようやく対応しました。完全なread/write invariance は実現できてないのですが、通常のケースでは使えるようになってると思います。
Large file support
2GBを超えるファイルを扱いたいです。
- Shiro(2007/11/09 18:59:09 PST): 対応しました。経緯はGauche:LargeFileSupportで。 拡張モジュールを書く人に重要な注意:gauche.hを他の全てのシステムヘッダファイルに先立ってincludeするようにしてください。 LFS関連のプリプロセッサシンボルの定義によって64bit版のシステム関数が 呼ばれるような仕組みがシステムヘッダファイルに仕込んであるケースがあるので (Linux/x86はそうです)。
regexp-replaceでも、名前によるバックリファレンスが使いたい
gemma(2006/05/01 22:38:05 PDT)
- Function: regexp-replace regexp string substitution
...
substitutionは文字列か手続きです。文字列の場合、バックスラッシュに続く数値を使ってサブマッチ文字列を参照できます。
このときに、バックスラッシュに続く名前も使えると便利だと思います。
- (2006/05/01 23:20:13 PDT) Rui: こんな感じでどうでしょう。"\k<名前>"を使ってください。
(パッチ省略)
- gemma(2006/05/02 08:30:08 PDT): これなら、記号に埋もれたregexpの中を見て、参照したいサブマッチが何番目なのかをチマチマ数えなくて済みます。助かります。ありがとうございました。
- Shiro(2007/11/08 13:04:35 PST): パッチ取り込みました。
SchemeからScm_TreeCoreClosestEntriesを使いたい
shinya(2007/05/26 20:04:56 PDT): こんな感じで使えるとうれしいです。
diff -u -r1.294 extlib.stub --- extlib.stub 24 May 2007 09:00:01 -0000 1.294 +++ extlib.stub 27 May 2007 02:56:59 -0000 @@ -1440,6 +1440,17 @@ (define-cproc %tree-map-dump (tm::<tree-map>) (body <void> (Scm_TreeMapDump tm SCM_CUROUT))) +(define-cproc tree-map-get-closest-entries (tm::<tree-map> key) + (body "ScmDictEntry *eq, *lo, *hi;" + "ScmObj eq_pair = SCM_FALSE;" + "ScmObj lo_pair = SCM_FALSE;" + "ScmObj hi_pair = SCM_FALSE;" + "eq = Scm_TreeCoreClosestEntries(SCM_TREE_MAP_CORE(tm), (intptr_t)key, &lo, &hi);" + "if (eq != NULL) eq_pair = Scm_Cons(SCM_DICT_KEY(eq), SCM_DICT_VALUE(eq));" + "if (lo != NULL) lo_pair = Scm_Cons(SCM_DICT_KEY(lo), SCM_DICT_VALUE(lo));" + "if (hi != NULL) hi_pair = Scm_Cons(SCM_DICT_KEY(hi), SCM_DICT_VALUE(hi));" + "SCM_RESULT = Scm_Values3(eq_pair, lo_pair, hi_pair);")) + ;; ;; Modules ;;
- Shiro(2007/05/27 00:18:30 PDT): あーこれは、類似機能を提供するつもりだったんですが APIをもっと考えたかったので保留にしてました。Scm_TreeCoreClosestEntries そのままを見せることはないと思います。
- shinya(2007/05/27 06:05:46 PDT): 了解です。欲しかった機能はxを越えない最大のキーを持つエントリを探したりする方法で、とりあえずこれがあればschemeで書けると思ったので要望を出してみました。
- Shiro(2007/11/08 12:07:28 PST): Scm_TreeCoreClosestEntriesをそのまま出すのではなく、 「xを越えない最大のキー」「x未満の最大のキー」「xを下回らない最小のキー」 「xより上の最小のキー」をそれぞれ探すAPIを設けました。tree-map-floor、 tree-map-ceiling、tree-map-predecessor、tree-map-successorとなっています。 これらは該当エントリのキーと値を多値で返しますが、他にキーだけを返すもの、 値だけを返すもの、のバリエーションもあります。
setrlimit, getrlimit
Rui(2006/10/23 00:05:30 PDT): サポートしているといい機能です。
- び(2007/02/13 09:46:17 PST): ということなので足してみました。テストとinfoは書いてません。書いた方がいいかなぁ...
- び(2007/02/13 15:14:45 PST): リソースを追加。現状ではMac OS X、FreeBSD、NetBSD、Ubuntu Linuxで使えるリソース名を列挙してみました。 http://www.opengroup.org/onlinepubs/007908799/xsh/sysresource.h.html にあるリソースはカバーしています。
- び(2007/02/13 20:44:15 PST): Lingrでruiさんと議論をして、SCM_POSITIVE_INFINITYを使うのをやめました。また、sys-setrlimitのハードリミット(第3引数)を省略可能にしてみました。
- び(2007/02/13 23:08:02 PST): rlim_tが32bitなシステム(Linuxがそうらしい)にも対応してみました。rlim_tが128bit以上だったり16bit以下だったりするシステム(そんなのがあるのかどうか知りませんが)はエラーにしてしまっています。また、sys/resource.h があるシステムはsetrlimit/getrlimitが存在するものと想定しています。
- Shiro(2007/11/08 12:07:28 PST): パッチいただきました。
2038年問題
<time>が2038年を超える時間を扱えないのは仕様でしょうか? できれば無制限になればうれしいです。。
- Shiro: それもそうですね。考えてみます。
- Shiro(2007/11/06 15:03:53 PST): 「どう書く?org」のトピックがきっかけで対応しました。秒数を64bit符号付き整数で扱うようにしています。
sys-environが欲しいので、作ってみた
このパッチ自体は色々と微妙な点があるのですが、とりあえず、この機能自体は欲しいです。
上記のパッチの仕様
- (sys-environ)を実行すると、'(("PATH" . "/usr/bin:...") ...)のようなalistが得られる。
- これは、(sys-environ)を実行した段階でのextern char **environをコピーしてalistを生成している。
- 環境変数はエンコーディングが不確定な為、key/val共に不完全文字列になる可能性有り。
問題点
- システムがenvironを持ってるかどうかの判定が怪しい
- とりあえず今のところは、setenvかputenvがあれば、environもある、という事にしてあります
- 名前はsys-environじゃなく、sys-environ->alistの方が適切かも?
- Cコードの品質が怪しいかも知れない
あと、この件とは関係無いですが、corelib.texiに、「direoctry」になってる部分がありました。 nekoie:2007/09/28 08:03:19 PDT
Shiro(2007/09/28 13:01:32 PDT): extern char **environはPOSIXで規定されてるようなので ( http://www.opengroup.org/onlinepubs/007908799/xbd/envvar.html ) 入れましょうか。 Windows上では使えないみたい (_environはあるが、使われなくなったとMSDNにある) なので 別の方法が必要でしょうが、とりあえずunixだけでも。
ところでextern char **environにアクセスする場合のthread safetyってどうなってる んでしょう。environをアクセスしてる最中に他のスレッドがputenv()したらどうなるか ってことです。putenv()自体はMT safeと記されているマニュアルもあるんですが、 これは複数のputenv()が競合してもオッケーってことで、変数への直接アクセスが どうなるのかはわからないですよね? まあ普通に考えればputenvはatomicなポインタ変更で実現されるので、 environをたどってるスレッドが中途半端な状態を見ることはないと思いますが。 (そのかわり、putenvは元の文字列がmallocされたものであったとしてもfree できないわけですね。他のスレッドが参照してるかもしれないから。)
nekoie(2007/09/28 16:38:31 PDT): あ、なるほど、Windowsには無いんですね、うーん。 man clearenvとか見ると、C的にはenvironの直接書き換えも可能なようで、 その場合はthread safetyじゃなさそうですけど、readonlyな使い方をしてる限りでは 確かに大丈夫そうに思えますね。自分も確信がある訳ではないですが……。
というか、このパッチ、environ自体がいきなりNULLだった場合の事を考慮してなかったのに今更気付きました……。すみません。 パッチ修正しました。
- http://d.tir.jp/Gauche-0.8.11-sys-environ-2.patch
- 単に if (environ == NULL) return SCM_NIL; を追加しただけです。
- Windowsかどうかの判定はいじってないです(__MINGW32__の有無だけでWindowsかどうかの判定をしていいのか、自信がなかったので……)。
Shiro(2007/09/28 17:50:33 PDT): WindowsだとGetEnvironmentStrings()が使えそうです。 どっちかというとCレベルで("key=var" ...) のリストにして、Schemeレベルで keyとvalueの切りだしをやる方がいいかなあ。今変更してるので近いうちにコミットします。
リストのシャッフル
リストをシャッフルする手続き、標準で欲しくないですか? 割と使いたくなることがあって、そのたびに適当にやっつけて書いているんですが、標準であるとうれしいです。
- leque(2006/09/13 22:26:58 PDT): こんな感じでどうでしょうか shuffle.scm
- Shiro(2007/09/28 13:19:32 PDT): 0.8.12で、gauche.sequenceにshuffle, shuffle!等の generic functionが加わります。
process-output->stringにキーワード引数を渡せるように
gauche.processのprocess-output->string, process-output->string-listに、 inputやencodingといった引数を渡せるようになるとうれしいです。
- Shiro(2007/09/28 13:23:55 PDT): 0.8.11かその前かで実現されました。
define-methodからオートロードしてほしい
「オートロードされるように設定しているけれども、 まだオートロードされていない変数」と同名の変数をdefine-methodで 定義したとき、define-method側でロードしてほしいです。
たとえばgosh起動直後だと、
(define-method expt ((a <string>) (b <string>)) #`",|a|^{,|b|}") (expt "x" "-3") ;; => "x^{-3}" (expt 3 4) ;; => *** ERROR: no applicable method for #<generic expt (1)> with arguments (3 4)
のようになってしまうのをdefine-method内でexptをオートロードして(expt 3 4) が81に評価されるようにしてほしいです。(2004/12/22 03:45:35 PST)
- Shiro(2007/08/11 21:51:34 PDT): 長くかかりましたが、0.8.11でfixされます。 →Gauche:autoload:define-methodとの干渉
hash-table-clear!
び(2006/09/25 00:27:37 PDT): <hash-table>をインプレースで空にする関数が欲しいです。
- Shiro(2007/02/13 21:23:14 PST): hashtable回りを今整理しています。ついでにつけます。
ftp-put-unique で作成したパスを取得したい
tabe(2007/04/30 03:11:50 PDT): ftp の STOU コマンドを使ってリモートにユニークなパスを作成したときに、そのパスを戻り値として取得したいです。
proftpd 1.2.10 や vsftpd 2.0.3 の場合には RFC 1123 に挙げられている書式に従っているの
で、次のパッチを当てるとパスをメッセージから切り出せました。
(同時に、copy-port にキーワード :element-type を渡すと警告されるので外しています。)
Index: lib/rfc/ftp.scm =================================================================== RCS file: /cvsroot/gauche/Gauche/lib/rfc/ftp.scm,v retrieving revision 1.5 diff -c -r1.5 ftp.scm *** lib/rfc/ftp.scm 2 Mar 2007 07:39:10 -0000 1.5 --- lib/rfc/ftp.scm 30 Apr 2007 09:53:19 -0000 *************** *** 34,39 **** --- 34,40 ---- ;; RFC 959 FILE TRANSFER PROTOCOL (FTP) ;; RFC 2428 FTP Extensions for IPv6 and NATs + ;; RFC 1123 Requirements for Internet Hosts -- Application and Support (define-module rfc.ftp (use srfi-1) *************** *** 413,433 **** ;; request server to receive data and send data (define (req&send conn cmdproc port) (ftp-set-type conn) ! (call-with-data-connection conn ! (lambda (get-data-socket) ! (let1 res (cmdproc) ! (if (not (string-prefix? "1" res)) ! (ftp-error res) ! (copy-port port (socket-output-port (get-data-socket)) ! :element-type (case (ftp-transfer-type conn) ! ((ascii) :character) ! ((binary image) :binary) ! (else ! (error "Invalid transfer type:" ! (ftp-transfer-type conn))))))))) ! (let1 res (get-response conn) ! (if (not (string-prefix? "2" res)) ! (ftp-error res) ! res))) (provide "rfc/ftp") --- 414,436 ---- ;; request server to receive data and send data (define (req&send conn cmdproc port) (ftp-set-type conn) ! (let ((dst #f)) ! (call-with-data-connection conn ! (lambda (get-data-socket) ! (let1 res (cmdproc) ! ;; RFC 1123 - 4.1.2.9 STOU Command: RFC-959 Section 4.1.3 ! (rxmatch-case res (#/^1\d\d FILE: (.+)$/ (#f pppp) (set! dst pppp))) ! (if (or dst (string-prefix? "1" res)) ! (copy-port port (socket-output-port (get-data-socket))) ! (ftp-error res))))) ! (let lp ((res (get-response conn))) ! (cond ((string-prefix? "2" res) ! (if dst ! (values res dst) ! res)) ! ((string-prefix? "1" res) ; vsftpd duplicates the 1XX reply for STOU. ! (lp (get-response conn))) ! (else ! (ftp-error res)))))) (provide "rfc/ftp")
- Shiro(2007/05/22 19:00:51 PDT): アイディアは頂きます。ただ、このパッチだと ftp-putなどが「サーバの種類によって、ひとつかふたつの値を返す」という 手続きになってしまいます。相手がどうかは普通は呼んでみるまでわからないので、 結局受ける側もリストにして受けるしかなく、valuesで返す意味がありません。 そこで、req&sendは常に2つの値を返すようにしておき、 ftp-put-uniqueにオプショナル引数を追加して、caller側で余分な値を 受け取りたいかどうかを指定できるようにします。そうすれば現在のAPIとの 互換性も保てますし。
- Shiro(2007/05/22 19:31:02 PDT): そもそもftp-put-uniqueはパスが返ってこないと 意味がないのか。ftp-put-uniqueだけAPI変更で常に2値を返す方がいいですね。
- tabe(2007/05/22 19:51:23 PDT): 検討いただきありがとうございます。おっしゃる通りAPI変更に賛成です。
- Shiro(2007/05/23 00:32:40 PDT): 変更はコミットしてあります (ftp.scm,v 1.7)。 もしよければチェックしてみてください。
- tabe(2007/05/23 08:47:51 PDT): proftpd 1.3.0 と vsftpd 2.0.5 で期待通りにパスを取得できることを確認しました。
configure実行時のオプションを最後に表示する
kenhys (2007/05/21 19:07:51 PDT) 些細なことですが、configure実行時には、最後に有効オプションとかをまとめて表示するとちょっと親切かと思います。例えば、以下のような具合で。
--- configure.ac.orig 2007-05-22 10:38:33.000000000 +0900 +++ configure.ac 2007-05-22 10:39:27.000000000 +0900 @@ -668,3 +668,12 @@ ext/uvector/Makefile ext/vport/Makefile ) +AC_MSG_RESULT( +[ + version: $GAUCHE_VERSION + multibyte: $GAUCHE_CHAR_ENCODING + slib: $SLIB_DIR + thread: $GAUCHE_THREAD_TYPE +] +) +
- Shiro(2007/05/22 18:35:19 PDT): 私自身はそんなに必要性は感じないのですが、 あっても悪いことは無いので足しときます。他にも表示したいパラメータがあれば おしらせください。
uri-encodeに:escapeを、uri-encode-stringに:encodeを
び(2007/02/07 01:08:34 PST): Lingrの中で出た話題で、uri-encodeに(uri-encode-stringにも) :escape char-set で強制的にエスケープする文字を指定できるように、そして、uri-encode-stringには、uri-encodeにかける前に変換したい文字エンコーディングを:encoding encode名 で指定できるようにしたいです。
- び(2007/02/07 01:39:01 PST): 激しく誤ったパッチだったので修正しました。
- び(2007/02/07 02:14:58 PST): さらにuri-decode-stringに:encoding引数を渡せるようにしてみました。
- び(2007/02/07 04:13:40 PST): :escapeは不要だと気づいたので、Lingrでの議論も参考にしつつ、*rfc2396-unreserved-char-set* と *rfc3986-unreserved-char-set* をconstantとして、また、デフォルトで使用するunreservedな文字集合をuri-unreserved-char-setというパラメータとしてexportしました。
- び(2007/02/07 06:59:06 PST): さらにLingrでの議論の中で、デフォルトの挙動をパラメータで制御しつつキーワード引数でも指定可能というのは複雑すぎると考えたので、パラメータuri-reserved-char-setをやめました。
Shiro(2007/02/21 00:41:09 PST): 取り込みました(uri.scm,v 1.19)。パッチは省略。
無限ループ時のシグナル処理
(2005/10/29 20:13:41 PDT): 無限リストをwriteしようとした時等に発生する無限ループ時に、 固まったプロセスをkillしようとしても、 Gauche側で一旦シグナルをプールしている為か、kill -9以外では終了してくれません。 できれば、無限ループ時にも、たまにシグナル処理してもらえると嬉しいですが、 可能なものなのでしょうか? (WishListに出しておいて何ですが、シグナルハンドラ回りで難しそうな気が、 微妙にしています……) ちなみに、linux-2.6.11+glibc-2.3.3+gcc-3.4.3で構築した、 Gauche-0.8.5[euc-jp,pthreads]を動かしています(環境依存だったらすみません)。
- Shiro: 0.8.9ではハンドルされないシグナルが一定以上たまると 終了するようになっています。
<rational>クラス
gosh> (rational? 22/7) #t
なのに、
gosh> (denominator 22/7) *** ERROR: integer required, but got: 3.142857142857143 Stack Trace: _______________________________________ 0 (error "integer required, but got:" q) At line 94 of "/usr/local/share/gauche/0.8.3/lib/gauche/numerical.scm"
というのは惜しい気がする(2005/01/23 18:09:21 PST)
- Shiro: rationalが正式にサポートされるようになりました。
gauche.netにSOMAXCONNが欲しい
び(2006/03/26 06:43:32 PST): CVS HEAD でmake-server-socket(s)にbacklogが渡せるようになったので、ついでと言ってはなんですがSOMAXCONNも欲しいです。
- Shiro: 0.8.7に入りました。
make-server-socket(s)にbacklogを渡したい
び(2006/02/24 19:23:17 PST): マルチスレッド版Kahuaの問題を追っていて思ったのですが、make-server-socket(s)に、backlogを渡したいことがあります。
Index: ext/net/netaux.scm =================================================================== RCS file: /cvsroot/gauche/Gauche/ext/net/netaux.scm,v retrieving revision 1.2 diff -u -r1.2 netaux.scm --- ext/net/netaux.scm 11 Sep 2005 23:50:02 -0000 1.2 +++ ext/net/netaux.scm 25 Feb 2006 03:15:12 -0000 @@ -112,7 +112,7 @@ (let-optionals* args ((path #f)) (unless (string? path) (error "unix socket requires pathname, but got" path)) - (make-server-socket-unix path))) + (apply make-server-socket-unix path (cdr args)))) ((eq? proto 'inet) (let-optionals* args ((port #f)) (unless (or (integer? port) (string? port)) @@ -129,20 +129,22 @@ (define (make-server-socket-from-addr addr . args) (let-keywords* args ((reuse-addr? #f) - (sock-init #f)) + (sock-init #f) + (backlog 5)) (let1 socket (make-socket (address->protocol-family addr) |SOCK_STREAM|) (when (procedure? sock-init) (sock-init socket addr)) (when reuse-addr? (socket-setsockopt socket |SOL_SOCKET| |SO_REUSEADDR| 1)) (socket-bind socket addr) - (socket-listen socket 5)))) + (socket-listen socket backlog)))) -(define (make-server-socket-unix path) - (let ((address (make <sockaddr-un> :path path)) +(define (make-server-socket-unix path . args) + (let ((backlog (get-keyword :backlog args 5)) + (address (make <sockaddr-un> :path path)) (socket (make-socket |PF_UNIX| |SOCK_STREAM|))) (socket-bind socket address) - (socket-listen socket 5))) + (socket-listen socket backlog))) (define (make-server-socket-inet port . args) (let1 addr (car (make-sockaddrs #f port))
- Shiro(2006/03/09 13:53:58 PST): 対応しました。
新DBI層で定義されたdbi-execute-queryではSQL文をパラメタライズしたくない。
旧DBI APIを使ったアプリケーションで、"'"を"?'"にエスケープしたSQL文を dbi-execute-queryに渡したらsql-tokenize段階でパースエラーになりました。
dbi-execute-query内部で呼んでいるdbi-doに'(:pass-through #t)オプションを付けて sql-tokenizeしないようにするのはどうしょうか。
- Shiro(2006/03/09 13:53:58 PST): 対応しました。
debug-printの情報表示を拡張
デバッグプリントがデフォルトで65文字で切られるけど、 可変にするとか、全部を表示するタイプのデバッグプリントをサポートしてほしい。 もう少し後ろまでの情報が欲しいときがあるのです。 --cut-sea:2005/12/04 01:53:52 PST
- Shiro(2006/01/28 01:18:10 PST): debug-print-widthというパラメータで
指定可能にしました。
- ありがとうございました。早速使わせてもらいました。cut-sea:2006/03/05 02:02:39 PST
Mingwでもドライブレター認識
Mingwでコンパイルした場合にドライブレターが認識されません。 単なる記入漏れと思いますので何かの折に修正して頂きたく思います。
--- ./src/main.c Mon Sep 5 21:05:25 2005 +++ ./patch/main.c Sun Nov 6 02:22:59 2005 @@ -327,3 +327,3 @@ scriptfile = argv[optind]; -#ifdef __CYGWIN__ +#if defined(__CYGWIN__) || defined (__MINGW32__) } else if (isalpha(argv[optind][0]) && argv[optind][1] == ':') {
sys-sigmaskで現在のシグナルマスクを取得したい。
び(2006/01/16 23:23:49 PST): sys-sigmaskの第2引数に#fを渡したら、現状のシグナルマスクを変更せずに取得するようにするためのパッチです。APIとしてはsys-getsigmaskとか別の名前の専用の関数を用意した方がきれいかとも思いましたが、sys-sigmaskがsigprocmask(2)への薄い皮であるという現状を尊重しました。
- Shiro(2006/01/27 20:03:05 PST): 取り込みました (パッチは省略)。
ちなみに最近のgenstubでは、「<sys-sigset>か#fを取る引数」は
こんなふうに書けるようになってます:
(define-cproc sys-sigmask (how::<fixnum> mask::<sys-sigset>?) (call "Scm_SysSigmask"))
クラスを再定義した場合、総称関数の呼び出し時にもインスタンスの更新を行って欲しい
ドキュメントによるとクラス再定義時のインスタンスの更新は「class-of、is-a?、slot-ref、 slot-set!、ref、getterメソッド、setterメソッド」で行われるとありますが、総称関数の呼び出しでも更新を行って欲しいです。 -- koguro:2005/12/19 07:01:37 PST
- Shiro (2005/12/19 11:35:47 PST): インスタンスの更新自体が総称関数の呼び出し(change-class) で行われているので、総称関数の呼び出しで更新をかけると無限ループしちゃいます。 現状での、インスタンスの更新をトリガするメソッド群では不十分なケースが あれば教えて下さい。
- koguro (2005/12/20 04:49:29 PST): なるほど、総称関数が含まれないのはそういう理由だったのですか。ただ、以下のようなケースでエラーとなってしまうので要望を挙げさせてもらいました。インタラクティブな環境でクラスをいじっているとたまにはまることがあります。
gosh> (define-class <foo> () ()) <foo> gosh> (define a (make <foo>)) a gosh> (define-method msg ((obj <foo>)) (print "foo")) #<generic msg (1)> gosh> (msg a) foo #<undef> gosh> (define-class <foo> () ()) <foo> gosh> (msg a) *** ERROR: no applicable method for #<generic msg (1)> with arguments (#<<foo> 0x6f73c0>) Stack Trace: _______________________________________ 0 (msg a) At line 6 of "(stdin)" 1 (msg a) At line 6 of "(stdin)" gosh>
- Shiro (2005/12/20 16:14:37 PST): そもそも再定義後のクラスはオブジェクトとしては別物 なので、マッチしないのはそれなりに一貫性があるとは思います (この「オブジェクトとしては別物」という性質を使ってクラス再定義機構自体が Gaucheのオブジェクトシステムで書かれているので)。 ただ、上記のようなエラーが非常にわかりにくいことには同意します。 開発中の問題であれば、例えば再定義された古いクラスについて、デフォルトの write objectが再定義された旨表示するようにする、ってのはどうでしょうか。 上の例だと、"no applicable method .... with arguments (#<<foo> (redefined) 0x6f73c0>) みたいに表示されるとか。
- koguro (2005/12/21 05:03:22 PST): 確かに再定義後のクラスがマッチしないことは、それはそれで正しいですね。おっしゃるようにエラーメッセージを修正していただけると対処しやすくなります。
組み込みクラスの equal?
(2005/10/27 19:08:34 PDT): time や char-set などの組み込みクラスも equal? で比較できるとうれしいです。 下の正規表現の中間表現を equal? で比較しようと思ったときに困ります。
- Shiro(2005/10/27 19:55:10 PDT): うむ。これは単に「後で書こう」と思ってそのまま 忘れてたっぽい。とりあえず<time>と<char-set>はequal?が動くようにしました。 他に忘れてるのがあったら教えて下さい。
正規定義
正規表現の断片を定義して、それを正規表現に埋め込めないでしょうか。独自の文字クラスを定義して、それを正規表現内で使いたいのですけども。
Shiro(2005/10/26 20:57:53 PDT): このへんは色々やりたいことがあって、基礎となる部分は 作ってあるんですが、ライブラリ化およびドキュメントが間に合ってないのです。 実はこんなAPIが既に用意されています。
gosh> (regexp-parse "abc*(def)+[xyz]*") (0 #\a #\b (rep #\c) (seq #0=(1 #\d #\e #\f) (rep #0#)) (rep #[x-z])) gosh> (regexp-optimize '(0 #\a #\b (rep #\c) (seq #0=(1 #\d #\e #\f) (rep #0#)) (rep #[x-z]))) (0 #\a #\b (rep-while #\c) #0=(1 #\d #\e #\f) (rep #0#) (rep-while #[x-z])) gosh> (regexp-compile '(0 #\a #\b (rep-while #\c) #0=(1 #\d #\e #\f) (rep #0#) (rep-while #[x-z]))) #<regexp 0x98a9b90>
中間表現の仕様についてはregexp.cを読んで下さい。
当方のプランとしてはこの上に
- SRE互換レイヤ
- もっと賢い正規表現オプティマイザ
等を載っけてからofficialにするつもりだったんですが、 もしよければこのAPIを使ってハックしてみてください。 多分APIおよび中間表現形式については大きな変更は無いと思います。 最適化のためにもっとノードの種類を増やす可能性はありますが。
- なるほどぉ。SRE互換レイヤを書いて……というのがいいんでしょうけど、Gaucheの中間表現をquasiquoteで構築する方法でいきます。(手抜き)
乱数発生源の初期化
srfi-27を使うとき、最初にrandom-source-randomize!を呼ぶのが面倒です。モジュールをuseするときに初期化してよいのでは?
- Shiro(2005/10/12 03:27:04 PDT): うーん、私はそういうのはむしろ明示的に初期化したい ですね。例えばの話ですが、Gaucheが他のLisp処理系にあるようなメモリイメージの ダンプ機能を備えた場合、use時の自動randomizeのみでは、イメージのリストア時に 初期化が走りません (ランダムソースの状態が保存されているので、イメージを 起動する度に同じ状態からのスタートとなる)。今、Gaucheでそれをやるプランが あるというわけじゃないですが、この仮想的な例からわかることは、 randomizeはアプリケーションの静的な定義の一部ではなく、 アプリケーションが走り出して行われる動的なアクションであるということだと 思います。
仮想バッファポートの内部バッファサイズを変えたい
び(2005/09/11 23:55:50 PDT): 仮想バッッファポートは手軽でとても便利なのですが、性能上の理由で内部バッファサイズを大きくしたい場合があります。 buffer-sizeはスロットにすることも考えましたが、嬉しいことはなさそうなのでやめました。
- Shiro(2005/10/27 19:24:25 PDT): パッチ採用させていただきます。
errno
(2005/09/11 03:06:18 PDT) POSIXあたりで定義されているerrnoが定数として用意されていてほしいです。システムコールの失敗を示すerrnoは、Schemeから<system-error>のerrnoスロットで参照できますが、errnoの定数がないとその数値の意味がわからないので。
他のシステムはというと、PerlではErrnoモジュールで定数が提供されています(perldoc Errno)。Pythonではerrnoモジュールが定数を定義しており、errnoから文字列表現を得る辞書もそこで提供されているようです。Rubyではerrnoがそれぞれ別々のクラスになっており、クラスのErrno定数から数値を知ることができます(参考)。
逆引き辞書やクラスは特にいらないと思います。システムインターフェイスとして、はじめからExxx定数が定義されているだけでよいと思います。
- Shiro: えーと、定数として用意しちゃったらやっぱり数値からExxxxという名前は
引けないんですが、そういう目的じゃなくて、例えばエラーハンドラ内でExxxxという定数で
処理を書きたい、ということでしょうか。それは確かにあったら便利だな。
全てを網羅することは出来ませんが、よくあるものについては定数で提供しましょうか。
逆の処理、つまりerrnoからその意味を知るには、sys-strerrorが0.8.6に入ります。 ただこれはExxxxの定数名を返してくれないので、それもあった方が便利ですかね。 - わかりにくくてすみません。定数が用意してあるといいということです。エラーハンドラ内でExxxという定数で処理を書きたいだけです。数値からExxxxという名前は引けなくてもよいです。
- Shiro(2005/10/27 19:24:25 PDT): 0.8.6から代表的なExxxxの値が定数として使えるようになります。
展開時に無限ループに陥るようなマクロを書いてしまったとき、エラーを出してほしい。
(2005/07/31 22:51:11 PDT) ねるWiki:ねる
- Shiro: それは無理。マクロ展開器はチューリング完全だから。……ってそういう 話じゃなくて、マクロ展開の結果元のフォームと同じになった場合なんかに 限定して検出してほしい、ということかな。 でも、マクロの扱うフォームの大きさに限りは無いので、たとえequal? で 比較するだけだとしても一回展開するごとに いちいちチェックしてたらコストがばかにならないような気がします。 R5RS macroの場合はさらにフォーム内の束縛変数が別の識別子に置き換わってる 可能性があるんじゃないかなあ…だとするともっと高くつきそう。
- ねるWiki:ねる: 停止問題は解けないですね(^^;; 同じフォームになった場合に、という意味でしたが、コストがえらく高くつくということで、了解しました。
genstubに<cstring>, <cstring-const>...を入れてほしい。
- Shiro: <const-char*> というのは近いうちに入ります。 <char*>も要りますかね。呼び出しの度にコピーが発生することになりますけど。
- ねるWiki:ねる: なんとなく安全な気がしてコピーする方(Scm_GetString)を使っていましたが、良く考えたらGaucheの文字列はimmutableなんでしたね。<const-char*>だけで十分かと思います。
- Shiro (2005/10/27 19:24:25 PDT): 結局、名前は<const-cstring>にしました。
srfi-1のfoldとgauche.collectionのfoldが衝突してしまうのを何とかして欲しい
- (2005/03/25 17:52:33 PST) koguro srfi-1とgauche.collectionの両方にfoldの定義があるため、srfi-1を後から読み込むと総称関数版のfoldが見えなくなります。gauche.collectionの読み込みが後になるよう気をつけて使えば回避できますが、ちょっと分かりにくい挙動だと思いますので何とかならないものでしょうか(こういったモジュール間の競合に関することが、ドキュメントに書いてあるだけでも助かります)。
Shiro: これ自分でも以前引っかかったなあ。とりあえず0.8.4ではlist版のfoldが 組み込みになるので、foldに関してだけはこの問題は起きにくくなると思います。 一般的な名前の衝突問題についてはもっと検討が必要。全部generic functionで 統合しちゃうと、今度は見えて欲しくないものが見えてしまう問題がありそうなんで。
クラス名(シンボル)からクラスオブジェクトを得る関数
標題の通りなんですが、class-nameの戻り値からclassオブジェクトそのものを得られる関数が欲しいです。 (make (find-class (class-name <time>)))なんてことができるfind-classみたいなやつ。find-moduleみたいな仕様でいいんじゃないかと思います。簡単に実現できるかなーと一瞬思ったんですが、わたしには無理でした。
Shiro (2004/08/24 03:32:11 PDT): クラスが全てdefine-classで定義されていて、 それを定義しているモジュールが分かっていれば、evalを使えば可能です。
(eval '<time> (find-module 'gauche)) ==> #<class <time>>
正確には、定義しているモジュールでなくても、そのクラスの束縛が可視な モジュールが分かればいいので、現在のモジュールでクラスを定義したモジュールを useしているような場合なら(eval class-name (current-module))でも構いません。
CommonLispのfind-classみたいなものを作るには、グローバルに クラス名→クラスオブジェクトのテーブルを持つ必要があります。 つまり、クラス名はクラス名で一つの名前空間を持つことになります。 でも、それはSchemeの、何でも一つの名前空間、という原則と 合わないんですね。
moduleが特別扱いなのは、moduleシステムが名前空間を管理する唯一の 機構として名前空間の上位に位置しているからです。
また、Common Lispではシンボルそのものがパッケージにより分離 できるので、モジュール間でのクラス名の衝突は問題になりません。 が、Gaucheでグローバルにクラス名→クラスオブジェクトのテーブルを 持ってしまうと、クラス名が衝突した場合に困ったことになります。 (現状では、クラス名が衝突していても両方のモジュールをimportしようと しない限り問題にならない)。
び(2004/08/24 06:46:31 PDT): なるほど、やはりevalを使うのですね。ありがとうございます。
Shiro(2005/09/10 17:21:42 PDT): このような「実行時に得られる名前の束縛を 知りたい」というケースは度々あって、それにevalをいちいち持ってくるのも 重いなあと思っていたんで、0.8.6には global-variable-ref という 組み込み関数を入れました。
read-string!
skimu read-block! が imcomplete string に対応してくれるんでもありかなぁ。
- Shiro(2004/08/24 19:31:27 PDT): 具体的にはどういう動作をするの? ちなみにstringの「実体」はimmutableなので、stringをバッファとして渡す ことはGaucheでは出来ないっす(作ってもいいけど、どっちにせよ新しい実体が アロケートされる)。それなら、read-block!してからu8vector->stringで 取り出すとかしても同じかなと。
- skimu(2004/08/24 20:55:41 PDT) 複雑な構造をもったバイナリファイル(TIFF や地図データに使われている DDF) を読み込むときに今まで u8vector を使ってたんですが、バイナリファイルの中からアスキーの文字列を 取り出すことも多く、それなら最初から文字列をバッファにとって substring! とかした方がいいかなと いうのが動機です。いちいち uvector から文字列を生成するのがもったいないような気がしたので... でも新しい実体がアロケートされるんじゃ意味なしですね。 しかも、 さっきからいろいろ実験してるんですが小さい文字列に区切って with-input-from-string しても思ったより 遅くならないです。 ところで、逆に、u8vector を入力ポートに直接結びつけるというのはどうでしょう?
- Shiro(2004/08/24 21:18:37 PDT): 「u8vectorをポートに」はやりたいと思っています。 より具体的には、「バッファになり得るもの」というスーパークラスを作って、 そのインスタンスであるバッファに対してポートを結びつけたり、 特定箇所をuvectorで取り出したり…みたいな演算を用意しておくと便利かなと。 (以前、message digest frameworkの時にちょっと話題になったやつです)。
- Shiro(2004/11/27 23:27:00 PST) 「uvectorをポートに」は0.8.2で入ります。
- Shiro(2004/11/29 20:41:15 PST): 0.8.2出しました。 GaucheRefj:open-input-uvectorとか GaucheRefj:open-output-uvectorとか GaucheRefj:string->u8vector!とか見て下さい。
file.util の make-directory* で pathname 末尾の "/" を許して欲しいです
gosh> (use file.util) (#<module file.util> #<module gauche.interactive>) gosh> (make-directory* "foo/bar/") ;; 末尾 "/" 有り *** ERROR: mkdir failed: No such file or directory Stack Trace: _______________________________________ gosh> (make-directory* "foo/bar") ;; 末尾 "/" 無し #t
option を考慮してませんが、こんな風に一旦 dirname/basename に分けてから pathname を再構成して sys-mkdir に渡してってのを使ってたりします。cut-sea:2004/07/24 02:03:53 PDT
(define (make-directory dir) (define (file-writable? path) (sys-access path |W_OK|)) (if (file-exists? dir) (if (file-is-directory? dir) #t (error "non-directory ~s is already exists in directory ~s" (sys-basename dir) dir)) (let ((parent (sys-dirname dir)) (child (sys-basename dir))) (if (file-exists? parent) (if (file-writable? parent) (sys-mkdir (string-append parent "/" child) #o755) (error "directory ~s unwritable during creating a directory ~s" parent dir)) (begin (make-directory parent) (make-directory dir))))))
- Shiro: Linux 2.4.x だと末尾"/"付きでもエラーにならないようです。 プラットフォームによる違いだと思うので、末尾"/"を除くようにしておきます。
正規表現同士のequal?
hira (2004/05/31 19:36:40 PDT): このテストが#tになって欲しいです。
(test* "re equal? test" #t (equal? '(list . #/^(-)( *)(.+)$/) '(list . #/^(-)( *)(.+)$/))) ;test re equal? test, expects #t ==> ERROR: GOT #f
現状では、文字列から生成された正規表現を含むtreeを返す関数のテストができません。
- Shiro: 直しました。(regexp.c,v 1.50)
リファレンスマニュアルの永続的なURL
hira: WiLiKiからリファレンスマニュアルを参照しておけば、きっと役に立つ。 そう思うのが人情というもの。 でも、それをやっちゃうとバージョンアップでリンクがアサッテを向いてしまうのです。 まさに諸刃の剣。 何時までたっても変わらないURI、そんなもの有るのだろうか? 有るのかどうか分からないけど、それを願っているという事をここに書いておきます。 #WiLiKi上で運営すると解決するのかしら?
Shiro: これは私も気になってました。texi2html使う限りは 避けられないんで、永続的なuriを吐いてくれる別のツールを使うしかないと 思います。ツールの選択については、
- html, info, pdf形式が日本語、英語で生成できること
- index, cross referenceを自動生成してくれること
- 私自身が書いていてストレスを感じないこと
- 現在のような、日英混合のドキュメントから言語毎のドキュメントへの プリプロセッサが容易に書けること
というのが条件です。WiLiKiは1, 2の点が問題。一応、WiLiKiをtext to html なプリプロセッサとして使ってマニュアルを書く実験は始めてはいますが。 生TeXやXMLベースのものは3.が問題。
hira: 私的には1, 2を解決するための努力を気長に重ねたいですね。今、WiKi風DSLに対するめちゃくちゃリッチな字句・構文解析フレームワークを作っているところです。WiKiはhtmlに対するグッドラッパーだったけど、それで収まる器じゃなかろう、という感じで。
Shiro: こんなのどうですか。今のところ関数とマクロにしか対応してませんが。 (Gauche:htmlリファレンスの参照)
fuyuki: なんかいろいろからんでみたい話なんですが、それは置いといて、 とりあえずtexi2htmlの-numberオプションをはずせばいくらかましなのでは。
hira: もう解決かよ!(笑)。GaucheRefj、いい感じですね。リンクを貼りなおす元気が沸いてきました。
stable-sort
安定であることが保証されたsortが欲しいです。いまのGaucheのsortは安定であることが保証されていないので、自分でstable-sortを用意しているのですが、標準であってもいいかなと。名前はstable-sort, static-sortもしくはアルゴリズム名をあらわすmerge-sortなどでもいいかもしれません。
- Shiro: ふむ。sortに関してはSRFIが出ていたのでそのfinalizationを
待っていたのですが、withdrawされてしまいました。
どっちにせよ、組み込みのsortはハイブリッドで、比較関数が渡された場合は
stableなアルゴリズムを使っています。ですからstable-sortみたいな別名で
常にstableな方を呼び出すようにするのは簡単なので、やっておきましょう。
- stable-sort, stable-sort!がcvsにcommitされましたね。どうもです。
- 戯: rubyのどっかで、"元の位置"情報を追加したものをunstable-sortしちまう (そうすれば同着なら"元の位置"に基づいてsortされる)ほうがいい…みたいな議論を聞いた記憶があるです。 少なくとも、stable-sortを実現する手段は、Native(?)なstable-sortアルゴリズムだけではない、ということで。
hash-tableのobject-apply
正規表現が最初からobject-apply出来るんだったら、hash-tableも最初からobject-apply出来てもいい気もします。 (慣れると、他のscheme処理系に移行しづらくなるかも知れないけど) -- nekoie (2004/04/25 02:56:21 PDT)
- Shiro: これはちょっと迷ってます。便利すぎるかなあと。
確かにhash-table-getは長いんで、refを使えるようにしようかとは
思っていますが。うーん。どーしよーかなー。他の人のコメントも希望。
- nakamura(2004/05/07 08:44:29 PDT): 正規表現の object-apply は私も好きなのですが,
これは正規表現が直書きされている場合だと思います.
(#/o+/ "foo")
みたいになってれば一見で rxmatch だとわかりますが,(define r #/o+/) ... (r "foo")
こっちだとすぐにはわからないかも. 直書きの場合はコード削減になりつつ可読性が低下しない のですが, hash-table のように変数に入っている場合は型が想像しやすい変数名にしないと 後で混乱しちゃいそうな気もしますね. でも慣れたらスラスラいけたりして.
- nakamura(2004/05/07 08:44:29 PDT): 正規表現の object-apply は私も好きなのですが,
これは正規表現が直書きされている場合だと思います.
- Shiro (2004/05/21 13:07:35 PDT): とりあえず0.8でrefと(setter ref)をhash tableにも 使えるようにしてみます。それで様子を見てみましょう。
www.cgiのget-meta関数もexportしてほしい
- CGI時にメタ変数を参照したい時に、sys-getenvでは、cgi-metavariablesを参照してくれないので…‥。 -- nekoie (2004/02/29 10:53:29 PST)
- あまりにも短いパッチ、或いは、パッチ無しで自前でimportするコード。
(define get-meta (with-module www.cgi get-meta))
- Shiro (2004/05/13 02:24:56 PDT): cgi-get-metavariable という名前でexport することにしました。0.8に入ります。
PostgreSQL対応
- [jun] Gauche:FAQにあるPostgresの対応はできているのでしょうか?
- Makoto(2003/07/04 07:25:19 PDT): http://sourceforge.net/mailarchive/message.php?msg_id=2846028 のスレッドを見て下さい。(ちなみに私はgauche.processを使って、 MySQLをmysqlコマンドを叩くという方法で使ってたり。)
- [jun] ここに情報を見つけました。初心者でもトライできる程度に資料が整理されていくのはどれでしょうね。やはりデフォルト実装がGauche本体に取り込まれて、文章が整備されていってほしいです。(^^;;
- Shiro(2004/02/23 20:58:49 PST): http://www.kahua.org/cgi-bin/kahua.cgi/kahua-web/show/dev/DBI
gauche-character-encoding の返り値の型
- satoru: ces-convert の第3引数に (gauche-character-encoding) を渡したところ、*** ERROR: string or #f is required for to-code, but got euc-jp というエラーが起きました。gauche-character-encoding の返り値の型が symbol なのが原因です。ces-convert に限らず、エンコーディング名は文字列で扱う場面が多そうなので、gauche-character-encoding の返り値の型は文字列の方が便利なような気がします。(2002/10/24 12:03:08 PDT)
Shiro: んがぐぐ。その通り。gauche-character-encodingは確か charconvを書くずっと前に作ったので、不統一になっていました。
ただ、gauche-character-encodingは文字集合、内部文字エンコーディング、 外部文字エンコーディング(文字列エンコーディング)のセットを 総称するものなので、charconvの扱うエンコーディング名と セマンティクスがちょいと異なるのです (gauche-character-encodingがutf-8の場合、文字集合iso10464、 内部エンコーディングUCS-4、外部エンコーディングUTF-8となります)。 Gaucheの用語もあまり厳密ではないので混乱のもとなのですが。
互換性も考えると、charconv側でgauche-character-encodingの返す シンボルも受けつけるようにしたほうが良いかもしれません。
- Shiro(2004/08/21 04:23:03 PDT): 現在は、charconv側がシンボルも受け付けるように なっています。
正規表現の「単語の先頭/終了へのマッチ」
- satoru メールのフィルタを作っていて Subject: の "sex" にマッチさせるルールを書こうと思ったんですが、 Essex に関連するメールがフィルタされると困るかも、と気になりました。リファレンスマニュアルに「単語の先頭/終了へのマッチ」は対応予定とあるので、期待しています。
port.* Portability libraries
- skimu port.* って autoload される gauche/port.scm と紛らわしく無いですか? コンパチビリチィライブラリだから compat とか.... ディレクトリ構成見直す機会があったらご検討ください。
Shiro: 確かに入出力のportとまぎらわしいですね。何でport.*にしたのかな... かなり初期の段階でつけた名で、その時は何か理由があったと思うのですが、忘れてしまいました。compatの方がよさそうです。幸い、port.*のモジュールはまだ正式にアナウンスしていないので、次のリリースにでも変更します。 (2002/09/27 00:48:12 PDT)