[Gauche-devel-jp] module名を文字列で指定してロードしたい

アーカイブの一覧に戻る

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)





Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る