2016年12月11日日曜日

GIMP Script-Fu (番外) 組み込み関数 substring の問題

GIMP の組み込み関数 substring には問題があるのかも知れません。
パラメータの値の開始位置が start と end とで異なるのです。
う~ん、困ったなぁ。
間違うよなぁ、これじゃぁ。


そう、 GIMP TinyScheme のバグとも思える挙動をします。  バグ は 言い過ぎかな ... 。.
勿論、 バグではなく、 仕様なのだと思います
とは言え、この仕様は直せないでしょうね。
この部分を弄ってしまうと、影響範囲が あまりにも 広いので。

組み込み関数 substring は、一見、正常に動いている様に見えるのですが ... 。
少し、変な値を返します。

      あっ、書き忘れました。  substring は プロシジャー ブラウザ には表示されない 基本的な Script-Fu の関数ですね。
      どうも、 Script-Fu の実装である TinyScheme では 勝手が違う 気がします。


では、どう言う事なのか?、 Script-Fu コンソール を使って簡単に説明して見ます。

通常の関数(様々な開発言語上のもの) では、
部分文字列を返す変数は 引数 に 元の文字列 と 開始位置 と 終了位置(若しくは 文字数) を採ります。

GIMP Script-Fu 上でも (substring str start end) の形で 部分文字列 が得られます。

それでは、コンソールを。

> (define str "01234567890")
str
> str
"01234567890"
> (string-length str)
11
> (substring str 0 1)
"0"
> (substring str 0 2)
"01"
> (substring str 5 2)
Error: (<unknown> : 45906740) substring: end out of bounds: 2

> (substring str 5 7)
"56"

文字列 "01234567890" と 11 桁のものを用意しました。
substring 関数は、  元の文字列 str と、 開始位置(0 起算) start と、 終了位置(1 起算) end と を引数に取るのが分かります。
開始位置と終了位置で、その起算が異なるのは、要注意!です。

勿論、 終了位置であって、 文字数ではないのは、 上のコンソールで示した通りです。 
引数の組み合わせによっては ご覧の様に Error になります。


Scheme を良くご存知の方からすれば、当たり前、なのかも知れませんが、
他の言語から来た人間には、とても、不自然に見えます。



0 件のコメント:

コメントを投稿