[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:000661] Re: dcl ruby interface



堀之内です。

私:
 > (将来インターフェース
 > が変らないとはまだ言えないんでほんとの一般公開は出来ませんが)

早速ですが、そうなるだろうという話しです。

 > そういえば、dcl に関連してやることを思い出しました。dclでエラー
 > やウォーニングの処理をする MSGDMP を、シグナルハンドラが差し換え
 > られるようにしないと、エラーでいきなり実行が止ってしまいますね。
 > ruby 用には、エラー時にはruby の「例外」を出す関数を初期化時に登
 > 録すべきですね。ウォーニングやメッセージの場合今までどおりでいい

dcl でメモリー関連のエラーが起きるとちょっとやっかいですね。実行
を止めないとろくでも無いことが起きたりします。しかし、恐らく 
MSGDMP で捕捉される者は筋のいいエラーで、メモリー関連のエラーが
起きる前に出るのでしょう(きっと)。ところが、元々が Fortran77 
である悲しさで、実行時に検知できないエラーがあり得ます。まず思い
つくのは配列の実際の長さが引数で渡された長さと違うということです。
というかメモリー問題は基本的にこれでほぼ尽きているような気がしま
す。

このエラーは未然に防ぐよりしようがありません。よって、dclのruby
インターフェースでは配列の長さは引数になっていてはまずいです。
今は、Fortranの

    SUBROUTINE USGRAPH(X,X.Y)

に対応して、ruby では

    DCL.usgraph(n,x,y)

と呼べるよう自動生成されてますが、配列の長さをあらわす n は自動
生成レベルでつぶすべきです。前にもいっぺん議論したことがあり、そ
のときは、一旦 DCL.usgraph(n,x,y) を許容して、その上に n をつぶ
すのを被せればいいという意見が強かったように思います。しかし、
dclは膨大なので自動生成のレベルでそれが出来るに越したことはない
と思います。つまり、最初から

    DCL.usgraph(x,y)

です。そのための枠組みは以前作りましたね。もともとは

    SUBROUTIE USGRAPH (
      INTEGER N
      REAL X(*)
      REAL Y(*)
    )

となっていたプロトタイプ宣言を、手作業で

    SUBROUTIE USGRAPH (
      INTEGER N
      REAL X(N)
      REAL Y(N)
    )

とするのを既にやってるわけです。よって、ruby インターフェースを
自動生成すると

dcl_usgrph(obj, x, y)
    VALUE obj, x, y;
{
    integer i_n;
    real *i_x;
    real *i_y;

    ..(略)..

    i_n=NA_LENGTH(x);
    if (i_n != NA_LENGTH(y)) {rb_raise(rb_eDclError,"x.length !=  y.length");}
    i_x = dcl_obj2crealary(x);
    i_y = dcl_obj2crealary(y);

    usgrph_(&i_n, i_x, i_y);

    ..(中略)..

}

となるようできるはずです(obj は "self" なので、これで 
DCL.usgraph(x,y) になります)。ちなみにもとのソースでは

dcl_usgrph(obj, n, x, y)
{
    ....
    VALUE obj, n, x, y;
    i_n = NUM2INT(n);
    i_x = dcl_obj2crealary(x);
    i_y = dcl_obj2crealary(y);
    usgrph_(&i_n, i_x, i_y);
    ....

です。

# ところで、細かいことですが、上では NumArray から length を求める
   マクロを仮に NA_LENGTH としました。引数が Array など NumArray 以
   外の場合は NumArray に変換してから処理すべきだという話しはすでに
   したことがあります。まだそうなってませんが。(これにより数値を含
   まない Array を排除するといった作業は NumArray にさせることがで
   きます。これは NumArray 固有の仕事として(今では)サポートしてます
   から任せばいいんです)。

ちなみに、このような自動生成をしないと、大量の関数に対し、手作業で

   def usgraphなんとか (x,y)
     n=x.lengh
     raise(DclError,"x.length !=  y.length") if (x.length !=  y.length)
     DCL.usgraph(n,x,y)
   end

といったものを用意することになります。

# 名前もどうしようか困りましたね。

---
堀之内 武                    horinout@xxxxxx
京都大学宙空電波科学研究センター     611-0011 宇治市五ヶ庄