Gauche:WishList:done

Gauche:WishList:done

Gauche:WishListに書かれたもので、対応済みのもの


file.lock みたいなモジュールが欲しいです

gauche.logger にある lock-file, unlock-file を汎用的にしたようなモジュールが

あると便利かなと思うのですがいかがでしょうか. --nakamura(2004/07/31 11:10:56 PDT)

全角空白も空白として認識しては?

Shiro:UnixUser0307Setuさんの書き込みより:

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と見なす、 としてもいいかもしれませんね。全角空白一文字のシンボルとか作られると 大変だし。

rfc.ftpの、ftp-set-typeをexportしてほしい

gemma(2009/04/10 23:38:51 PDT): ProFTPDが、SIZEコマンドをASCIIモードでは受け付けない仕様になっているので、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)

call-with-client-socket でバッファリングを指定したい

(2009/05/20 02:52:50 PDT): 標題の通りです。procの中でport-bufferingにset!するのも不細工なので。

provideの引数を省略可にする

以前にもprovideの引数の話題があがっていましたが、いっそのこと引数を省略できるようにしてしまえないでしょうか? requireしたときの名前を記憶しておいて、引数なしのprovideが現れたら先の名前を使用するようにするというのはどうでしょう。--koguro(2005/11/06 03:17:14 PST)

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 では使えることを確認しました。

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 向けのコードと同じようにする?)

クロスコンパイルでバイナリを作成する

YOKOTA Hiroshi(2007/11/25 13:32:03 PST): 現在の MinGW バイナリは構築時に Cygwin も必要とするなど準備が面倒なのでUnix上にクロスコンパイラを用意してそちらで構築するようにしてみました。

Base64 エンコーディングに改行を含めないオプションを追加する

tabe(2007/12/06 21:44:09 PST): RFC 3548 の2.1に書かれているような、エンコードされたデータに 改行を含めないオプションが欲しいです。下は案のパッチです: (コメントアウトしました)

正規表現の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"

Large file support

2GBを超えるファイルを扱いたいです。

regexp-replaceでも、名前によるバックリファレンスが使いたい

gemma(2006/05/01 22:38:05 PDT)

 (パッチ省略)

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
 ;;

setrlimit, getrlimit

Rui(2006/10/23 00:05:30 PDT): サポートしているといい機能です。

2038年問題

<time>が2038年を超える時間を扱えないのは仕様でしょうか? できれば無制限になればうれしいです。。

sys-environが欲しいので、作ってみた

このパッチ自体は色々と微妙な点があるのですが、とりあえず、この機能自体は欲しいです。

上記のパッチの仕様

問題点

あと、この件とは関係無いですが、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だった場合の事を考慮してなかったのに今更気付きました……。すみません。 パッチ修正しました。

Shiro(2007/09/28 17:50:33 PDT): WindowsだとGetEnvironmentStrings()が使えそうです。 どっちかというとCレベルで("key=var" ...) のリストにして、Schemeレベルで keyとvalueの切りだしをやる方がいいかなあ。今変更してるので近いうちにコミットします。

リストのシャッフル

リストをシャッフルする手続き、標準で欲しくないですか? 割と使いたくなることがあって、そのたびに適当にやっつけて書いているんですが、標準であるとうれしいです。

process-output->stringにキーワード引数を渡せるように

gauche.processのprocess-output->string, process-output->string-listに、 inputやencodingといった引数を渡せるようになるとうれしいです。

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)

hash-table-clear!

(2006/09/25 00:27:37 PDT): <hash-table>をインプレースで空にする関数が欲しいです。

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")

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
+]
+)
+

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名 で指定できるようにしたいです。

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]を動かしています(環境依存だったらすみません)。

<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)

gauche.netにSOMAXCONNが欲しい

(2006/03/26 06:43:32 PST): CVS HEAD でmake-server-socket(s)にbacklogが渡せるようになったので、ついでと言ってはなんですがSOMAXCONNも欲しいです。

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))

新DBI層で定義されたdbi-execute-queryではSQL文をパラメタライズしたくない。

旧DBI APIを使ったアプリケーションで、"'"を"?'"にエスケープしたSQL文を dbi-execute-queryに渡したらsql-tokenize段階でパースエラーになりました。

dbi-execute-query内部で呼んでいるdbi-doに'(:pass-through #t)オプションを付けて sql-tokenizeしないようにするのはどうしょうか。

debug-printの情報表示を拡張

デバッグプリントがデフォルトで65文字で切られるけど、 可変にするとか、全部を表示するタイプのデバッグプリントをサポートしてほしい。 もう少し後ろまでの情報が欲しいときがあるのです。 --cut-sea:2005/12/04 01:53:52 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)への薄い皮であるという現状を尊重しました。

クラスを再定義した場合、総称関数の呼び出し時にもインスタンスの更新を行って欲しい

ドキュメントによるとクラス再定義時のインスタンスの更新は「class-of、is-a?、slot-ref、 slot-set!、ref、getterメソッド、setterメソッド」で行われるとありますが、総称関数の呼び出しでも更新を行って欲しいです。 -- koguro:2005/12/19 07:01:37 PST

組み込みクラスの equal?

(2005/10/27 19:08:34 PDT): time や char-set などの組み込みクラスも equal? で比較できるとうれしいです。 下の正規表現の中間表現を 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を読んで下さい。

当方のプランとしてはこの上に

等を載っけてからofficialにするつもりだったんですが、 もしよければこのAPIを使ってハックしてみてください。 多分APIおよび中間表現形式については大きな変更は無いと思います。 最適化のためにもっとノードの種類を増やす可能性はありますが。

乱数発生源の初期化

srfi-27を使うとき、最初にrandom-source-randomize!を呼ぶのが面倒です。モジュールをuseするときに初期化してよいのでは?

仮想バッファポートの内部バッファサイズを変えたい

(2005/09/11 23:55:50 PDT): 仮想バッッファポートは手軽でとても便利なのですが、性能上の理由で内部バッファサイズを大きくしたい場合があります。 buffer-sizeはスロットにすることも考えましたが、嬉しいことはなさそうなのでやめました。

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定数が定義されているだけでよいと思います。

展開時に無限ループに陥るようなマクロを書いてしまったとき、エラーを出してほしい。

(2005/07/31 22:51:11 PDT) ねるWiki:ねる

genstubに<cstring>, <cstring-const>...を入れてほしい。

ねるWiki:ねる

srfi-1のfoldとgauche.collectionのfoldが衝突してしまうのを何とかして欲しい

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 に対応してくれるんでもありかなぁ。

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))))))

正規表現同士の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を返す関数のテストができません。

リファレンスマニュアルの永続的なURL

hira: WiLiKiからリファレンスマニュアルを参照しておけば、きっと役に立つ。 そう思うのが人情というもの。 でも、それをやっちゃうとバージョンアップでリンクがアサッテを向いてしまうのです。 まさに諸刃の剣。 何時までたっても変わらないURI、そんなもの有るのだろうか? 有るのかどうか分からないけど、それを願っているという事をここに書いておきます。 #WiLiKi上で運営すると解決するのかしら?

Shiro: これは私も気になってました。texi2html使う限りは 避けられないんで、永続的なuriを吐いてくれる別のツールを使うしかないと 思います。ツールの選択については、

  1. html, info, pdf形式が日本語、英語で生成できること
  2. index, cross referenceを自動生成してくれること
  3. 私自身が書いていてストレスを感じないこと
  4. 現在のような、日英混合のドキュメントから言語毎のドキュメントへの プリプロセッサが容易に書けること

というのが条件です。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などでもいいかもしれません。

hash-tableのobject-apply

正規表現が最初からobject-apply出来るんだったら、hash-tableも最初からobject-apply出来てもいい気もします。 (慣れると、他のscheme処理系に移行しづらくなるかも知れないけど) -- nekoie (2004/04/25 02:56:21 PDT)

www.cgiのget-meta関数もexportしてほしい

 (define get-meta (with-module www.cgi get-meta))

PostgreSQL対応

gauche-character-encoding の返り値の型

Shiro: んがぐぐ。その通り。gauche-character-encodingは確か charconvを書くずっと前に作ったので、不統一になっていました。

ただ、gauche-character-encodingは文字集合、内部文字エンコーディング、 外部文字エンコーディング(文字列エンコーディング)のセットを 総称するものなので、charconvの扱うエンコーディング名と セマンティクスがちょいと異なるのです (gauche-character-encodingがutf-8の場合、文字集合iso10464、 内部エンコーディングUCS-4、外部エンコーディングUTF-8となります)。 Gaucheの用語もあまり厳密ではないので混乱のもとなのですが。

互換性も考えると、charconv側でgauche-character-encodingの返す シンボルも受けつけるようにしたほうが良いかもしれません。

正規表現の「単語の先頭/終了へのマッチ」

port.* Portability libraries

Shiro: 確かに入出力のportとまぎらわしいですね。何でport.*にしたのかな... かなり初期の段階でつけた名で、その時は何か理由があったと思うのですが、忘れてしまいました。compatの方がよさそうです。幸い、port.*のモジュールはまだ正式にアナウンスしていないので、次のリリースにでも変更します。 (2002/09/27 00:48:12 PDT)

More ...