yasuy****@javao*****
yasuy****@javao*****
2003年 11月 21日 (金) 18:14:08 JST
えんどうです。 DBI/DBDのようなモジュールを書きたいと思っています。 +-------------------------------+ | dbi | 統一的DB-API層 | (export <driver> | | <connection> | | <query> | | <result-set> | (dbi-make-driver "pg") | ...) | ==> <pg-driver> | | +--------------+----------------+ | dbd-pg | dbd-mysql | 差し替え可能なドライバー層 | <pg-driver> | <mysql-driver> | dbd-make-driver | | | ==> <pg-driver>/<mysql-driver> +--------------+----------------+ | pg | mysql | Cライブラリをそのままwrapした層 +--------------+----------------+ | libpq | libmysql | Cライブラリ +--------------+----------------+ |PostgreSQL | MySQL | RDBMS | server | server | +--------------+----------------+ こういうモジュール階層があったとき、 プログラマー側から以下のように利用できるとうれしいと思っています。 --------------------------------------------------------------------- (use dbi) (define driver (dbi-make-driver "pg")) ;; ==> <pg-driver>型インスタンスを得たい (define connection (dbi-make-connection ;; 引数にとった<driver>の型で driver "yasuyuki" "hogehoge" ;; ディスパッチしして、 "dbname=yasuyuki user=yasuyuki")) ;; ==> <pg-connection>型が返ることを期待 (define query (dbi-make-query "select * from test")) (define result (dbi-execute-query query)) (dbi-close result) (dbi-close query) (dbi-close connection) --------------------------------------------------------------------- dbi側の dbi-make-driver では、 文字列引数で指定されたモジュールを動的にロードして、 そのモジュールの dbd-make-driver を呼んで 各ドライバーのインスタンス (上の例だと <pg-driver> 型)が返るように プログラムしたいです。 (define-generic dbi-make-driver) (define-method dbi-make-driver ((driver-name <string>)) (define module-name (string-append "dbd-" driver-name)) (load module-name) ;; loadでいいのか..? (dbd-make-driver driver-name)) dbd-pgでは、 (define-method dbd-make-driver ((driver-name <string>)) (make <pg-driver> :driver-name driver-name)) と書いていますが、実行時に *** ERROR: unbound variable: dbd-make-driver Stack Trace: _______________________________________ 0 (dbi-make-driver "pg") At line 5 of "(stdin)" というエラーが発生し、dbd-make-driver が呼ばれません。 モジュール名を文字列で指定して use や require や import する 方法はあるのでしょうか...? -- ENDO Yasuyuki <yasuy****@javao*****> http://www.javaopen.org/~yasuyuki/ (Personal/Japanese Only) http://www.javaopen.org/jfriends/ (Japanese Only)