11月のカレンダー
     12
3456789
10111213141516
17181920212223
24252627282930
最近の日記
全体の新着
各月の日記
ユーザーRSS
hanyaさんの公開日記
09月11日
02:14
Ruby-UNO ブリッジを利用して Ruby 用のコンポーネントローダーを作成してみたので、さらに Ruby 用のスクリプトプロバイダを作成しようとしてみているが…。
スクリプトプロバイダを書くときにいつも困るのはその仕様。
既存のスクリプトプロバイダでいうと、Java や JavaScript 用のスクリプトプロバイダが利用している parcel を設定ファイルとして実行するマクロやその説明などを記載しておくもの。もう一つは Python スクリプトプロバイダが利用している、コード内の関数を実行するもの。
前者の parcel を利用したものは、コードを解析せずに実行する関数名などを特定でき、説明やそれ以外の情報も設定ファイルから取得できる。しかし、parcel を作成するのが面倒。
後者の方法では、コードを実行せずに解析して関数名などを取得する方法が必要。Python スクリプトではこの方法を採用していたが、OOo 3.2.1 のセキュリティ修正以前では、一度 Python のマクロのファイルを読み込んでモジュールとして実行したのち、関数の一覧を作成していた。修正後には、コンパイルのみされた構文木から関数名の一覧を取得している。

どちらを利用するか悩む…。前者では、実行するマクロの単位がファイルごとになりがちだが、Java でのマクロように、関数単位で実行することにすれば一つの parcel に複数の関数を定義できる。
そうなると、後者でもあまり変わらない。
一方、Ruby にはドキュメント文字列がない、Python の __doc__ に相当するものがないので、マクロの説明を同じファイル内に記載できない。parcel を利用する場合、説明を記述できる上にマクロ名および説明を多言語化できる利点もある (スクリプトプロバイダが対応しておれば)。
parcel があった場合のみ情報をそこから読み込むのもよいかもしれない。

Ruby の場合にはもう一つ問題がある。Ruby のコードから、コードを構文木にパースする方法が提供されていない。C の関数を利用すれば可能なためそれほど問題ではない。

一番大きな問題は、Ruby でファイルを require したり load するとトップモジュールにマージされてしまうこと。load の引数指定で独立したモジュール内で実行できないことはない。
module_eval すると特異メソッドでなければアクセスできない。
引数を与え、返り値が欲しいので関数を実行する必要がある。

module_function で実行できる関数を定義させる?

なかなか決まらない…。とりあえずこんな感じ…?

expr = '
def get_ctx(name)
p CONTEXT
CONTEXT
end

module_function :get_ctx
'

mod = Module.new
mod::CONTEXT = 100

mod.module_eval(expr)

p mod.singleton_methods(true) # => [:get_ctx]
p "ret: %d" % mod.get_ctx("hoge") # => ret: 100
公開日記トップへ
oooug-jp SNS

●サイドメニュー

  • 公開日記
  • >公開日記はログインしなくても読めます

http://www.ospn.jp/

inetd