一歩進んだ Rexx

Classic REXX (REstructured eXtended eXecutor)
File #11

そしてふたたび Base64 -- 2001.2.15

ソレは, さかのぼること数年前。 当時, 情報の少なかったRexxのために, 起死回生の一手として放ったのが, 「Base64デコード」をはじめとしてソースを公開している, このページ。 なーんつって。
いまでも豊富な訳じゃないけどね。

ソレはさておき, その最古の Base64デコードの改訂版が, 突如として完成した訳だもん。

Base64DecoStrMulti: parse arg Base64DecoStrMulti; return Base64DecoStrMultiCore();
Base64DecoStrMultiCore: procedure expose (Base64DecoStrMulti)
   BaseChars = xrange('A', 'Z')xrange('a', 'z')xrange('0', '9')'+/='
   res = ''
   do n = 1 to value(Base64DecoStrMulti'0')
      parse value value(Base64DecoStrMulti||n) with txt '='
      val = translate(txt, xrange(, '3f'x), BaseChars)
      bin = ''
      do i = 1 to length(val)
         bin = bin||substr(x2b(c2x(substr(val, i, 1))), 3)
      end
      res = res||bin
   end
   return x2c(b2x(left(res, length(res) %8 *8)))

なにが新しくなったのか。まずは, ソレをあげてみよー。

  1. 大きくなった
  2. 名前が変わった
  3. 複数行に対応
  4. 変換が早くなった

複数行に対応ってことで, 実は 指定の方法が前と違うのら。

str.1  = 'Qk1mCgAAAAAAAD4AAAAoAAAAoAAAAIIAAAABAAEAAAAAACgKAADODgAAzg4AAAAAAAAAAAAAAAAA'
str.2  = 'AP///wD/////////////////////////////////////////////////////////////////////'
str.3  = '////////////////////////////////////////////////////////////////////////////'

   〜
str.47 = '/////////////////////////////////////////////////////w=='
str.0 = 47

bin = Base64DecoStrMulti('str.')

てな具合。 (↑)のサンプルは途中 省略してあるんだけど, そこはオッケーだよね。

早くなったのは, 中間データを保持している変数 resに加え, 新たに binてゆーのを用意したから。
こんなんで早くなるのは, データの扱い方が違ってくるからなのら。 セットするデータが「ど〜ん」と大きくなる分には構わないんだけっちょ, ちまちまと少しずつ大きくなってくと, とんでもなく遅くなるみたい。 NetRexxでも そーだっただよ。


演算子の違い -- 2000.12.4

演算子。・・ そのうちマンガで「えんざんこ」とか出てくるかも。 (←ページ違うゾ)

Rexxの演算子つったら, C言語系と かけ離れていたりする。 ソレは 52度くらいの角度を持ってたりする。なんてウソ。
て訳で, めったに Rexx使わないって人は ちょいとした間違いに気付かず なにかと手間取る事もあるのかも。 ま, ソレほど違う訳よ, コレが。

もし, Rexxのオプションで 演算子を本来のRexxのものにするとか C言語っぽくするとかできたら, もっと使いやすいかも。 そう, せめて NetRexxにそんな機能が付いたらよいのに。 なんて思った人は σ(^^) だけじゃないはず。

そーゆーことで, まとめてみたあるよ。(半角がよかったかな)

演算子の比較表
種類RexxC言語系
加減乗除+ − * /同じ
整数割り算
剰余//
べき乗**なし
notなし(xorを使えば・・)
and or(NetRexxでは & |) & |
xor(NetRexxでは &&)
bitシフトなし<< >>
論理 not\ (日本では¥)!
論理 andなし(if のネストで)&&
論理 or(NetRexxでは ,)||
三項演算子なし?:
文字列の連結|| 隣接 ブランクなし(Javaでは +)

こんなとこかな。
これは痛い ってのが, Rexxに bitシフトがないこと。<<とか>>って, 明確に大きいとか明確に小さいとか, そんなのに割り当てられてて, もーどーしよーもない。(T-T)
ほかにも, !?が変数名に使えるってゆーのが問題だったりする。 てゆーのは次の式によって明らかになるであろー。

if num != 0 then
   say '0じゃない'

コレって, num! を連結したのと 0が 等しいかどーかってことになっちゃう訳だよね。 つい C言語っぽく読んでしまうと悩むことになっちゃうのら。 みんなも気を付けよー。

うじゃ (^o^)/~


regexp -- 正規表現を Rexxで -- 2000.9.24

IBM のページに「正しいサーバー・サイド・スクリプト記述言語の選び方」 てのがあって,

ほー, いろいろあるもんだに。でも Rexxを押さえてないとは片手間だね。
・・ 違う, 片手落ちだね。
などと思ったあるよ。

そこには Javaでは正規表現が使えないことが出てるけど, 全くできない訳じゃなくって, 外部ライブラリ(?)として, そーゆーのがあるにょ。
で, もちろん Rexxにも そーゆーのが存在する。ふっふふふ。・・ あっはっはー。 (←ぉぃ)
どこにそんなのがあるのかっつーと, ソレは EMXにあるのら。灯台モトクラシー ってヤツ?
そして, コレを使ったプログラムも公開してたりするのさっっ。 うーん, よいよい。

で, コレを使えば他のそーゆースクリプト言語と渡り合える ・・ かとゆーと, そーゆー訳でもない。 てゆーのは, 間違った regular expressions (正規表現)を指定しちゃうとエラーになるから。
んで, ソレをプログラムで拾うことができない訳じゃないけど, ちょっち使いづらい。 ま, 動かしてみると分かるんだけどね。

てことで, σ(^^)公開しているソレは, 少しばかし手を加えてるのら。 さー, どこだか当ててみそ。

で, 肝心の使い方はソースファイルに記されていて, (↓)こんな感じ。

  RegexxStart(REGEXP, STRING)
    Find REGEXP in STRING and return the start position of the match.
      STRINGに matchした, 最初の文字位置
    Return values:
      0          No match
      1, 2, ...  Position in STRING of the start of the first match
      -1         改造版: REGEXPが変

  RegexxEnd(REGEXP, STRING)
    Find REGEXP in STRING and return the end position of the match.
      STRINGに matchした, 最後の文字位置
    Return values:
      0          No match
      1, 2, ...  Position in STRING of the end of the first match
      -1         改造版: REGEXPが変

  RegexxSubstr(REGEXP, STRING)
    Find REGEXP in STRING and return the matching substring.
    Return the empty string if there is no match.
      STRINGに matchした文字列
      改造版: REGEXPが変なときは戻り値の長さが 0

  RegexxReplaceMatch(REGEXP, REPLACEMENT, STRING)
    Find REGEXP in STRING, replace the matching substring with
    REPLACEMENT, and return that substring.
      matchした文字列を置き換えた部分の文字列
      改造版: REGEXPが変なときは戻り値の長さが 0

  RegexxReplaceFirst(REGEXP, REPLACEMENT, STRING)
    Replace the first match of REGEXP in STRING with REPLACEMENT and
    return the resulting string.
      最初に matchした部分を置き換えた文字列
      改造版: REGEXPが変なときは戻り値の長さが 0

  RegexxReplaceAll(REGEXP, REPLACEMENT, STRING)
    Replace the all matches of REGEXP in STRING with REPLACEMENT and
    return the resulting string.
      matchした部分を全て置き換えた文字列
      改造版: REGEXPが変なときは戻り値の長さが 0

関数名を見ると分かる通り, この外部関数パッケージの名前は「regexx」。 つまり regexp (regular expressions)とアレして, Regexx て訳なのら。いや, Regexxかも, とかゆー意見は却下にょ。
つーより, ホントのところは知らないんだけどね。

て訳で, 使う前に行う, コレが外部関数パッケージであるってことの宣言と, ロードは(↓)だお。

call RxFuncAdd 'RegexxLoadFuncs', 'regexx', 'RegexxLoadFuncs'
call RegexxLoadFuncs

んで, 念のためだけど, コレがコンパイル方法。
gcc -Zdll -Zomf -Zso -Zsys -s -O regexx.c regexx.def -lregexp

さー, これで鬼に金棒, 猿にバナナ。 (←?)
CGIは Rexxに決まりっ ! (^O^)/ (←そーなのか?)


ギャオスニャオス -- 2000.8.25

君はニャオスを知っているだろうか。 あー, ピカチュウのに出てくるアレ? (←ソレはニャース)
そーではなく, 葉山さんが公開している shellのことなのら。
コレのよいとこは, コマンドラインで, コマンド名とか 引き数のファイル名をすべてタイプすることなく, TABキーで補完できること。 他にも機能盛りだくさんなんだけどね。(^^)

でも, 今までの cmd.exeと比べて, キー操作に違いが出てくる。けど, そこにぬかりはなくって, カスタマイズで切り抜けられるにょ。
たとえば σ(^^) にとっての必要なソレは ・・

コレで移行は完ぺきでし。 てことで, ソレを設定ファイル(?)にアレしてみよー。 しかも, Rexxで。

ところで, Rexxのプログラムで, こんなことを(↓)したらどーなるだろー。

/* 試してみよう */
'dir'
'pause'
'set'

cmd.exe(CMD)に ソレが渡され実行されちゃうよね。 Nyaosだったら, ソレが NYAOSに渡されるのら。

/* nyaos 設定ファイル (_nyaos) */

/* 'alias dir ls -la' */
'bindkey CTRL_LEFT  backward_word'
'bindkey CTRL_RIGHT forward_word'
'bindkey CTRL_DEL   kill_line'

で, これだけじゃアレなんで, 一部をプログラムっぽくしてみよー。

keys = 'CTRL_LEFT     CTRL_RIGHT   CTRL_DEL'
func = 'backward_word forward_word kill_line'
do i = 1 to words(keys)
  'bindkey' word(keys, i) word(func, i)
end

say 'address は' address() 'です。'

さー君も Nyaosで Rexxを使おう。・・ って, (↑)だけじゃ Rexxの必要ないかも。(T-T)

あ, 書いた後で分かったんだけど, サンプルの Rexxプログラム入ってたね。気付かなかったよー (さくら調)。 (^o^)\(☆バキッ)


Copyright (C) 1998-2004 Rexx使いの織華
email: ori@drive.co.jp