ソレは, さかのぼること数年前。
当時, 情報の少なかった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)))
なにが新しくなったのか。まずは, ソレをあげてみよー。
複数行に対応ってことで, 実は 指定の方法が前と違うのら。
str.1 = 'Qk1mCgAAAAAAAD4AAAAoAAAAoAAAAIIAAAABAAEAAAAAACgKAADODgAAzg4AAAAAAAAAAAAAAAAA' str.2 = 'AP///wD/////////////////////////////////////////////////////////////////////' str.3 = '////////////////////////////////////////////////////////////////////////////' 〜 str.47 = '/////////////////////////////////////////////////////w==' str.0 = 47 bin = Base64DecoStrMulti('str.')
てな具合。 (↑)のサンプルは途中 省略してあるんだけど, そこはオッケーだよね。
早くなったのは, 中間データを保持している変数 res
に加え, 新たに bin
てゆーのを用意したから。
こんなんで早くなるのは, データの扱い方が違ってくるからなのら。
セットするデータが「ど〜ん」と大きくなる分には構わないんだけっちょ, ちまちまと少しずつ大きくなってくと, とんでもなく遅くなるみたい。
NetRexxでも そーだっただよ。
演算子。・・ そのうちマンガで「えんざんこ」とか出てくるかも。 (←ページ違うゾ)
Rexxの演算子つったら, C言語系と かけ離れていたりする。 ソレは 52度くらいの角度を持ってたりする。なんてウソ。
て訳で, めったに Rexx使わないって人は ちょいとした間違いに気付かず なにかと手間取る事もあるのかも。 ま, ソレほど違う訳よ, コレが。
もし, Rexxのオプションで 演算子を本来のRexxのものにするとか C言語っぽくするとかできたら, もっと使いやすいかも。 そう, せめて NetRexxにそんな機能が付いたらよいのに。 なんて思った人は σ(^^) だけじゃないはず。
そーゆーことで, まとめてみたあるよ。(半角がよかったかな)
種類 | Rexx | C言語系 |
---|---|---|
加減乗除 | + − * / | 同じ |
整数割り算 | % | / |
剰余 | // | % |
べき乗 | ** | なし |
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^)/~
IBM のページに「正しいサーバー・サイド・スクリプト記述言語の選び方」 てのがあって,
そこには 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^)/ (←そーなのか?)
君はニャオスを知っているだろうか。
あー, ピカチュウのに出てくるアレ? (←ソレはニャース)
そーではなく, 葉山さんが公開している shellのことなのら。
コレのよいとこは, コマンドラインで, コマンド名とか 引き数のファイル名をすべてタイプすることなく, TABキーで補完できること。
他にも機能盛りだくさんなんだけどね。(^^)
でも, 今までの cmd.exeと比べて, キー操作に違いが出てくる。けど, そこにぬかりはなくって, カスタマイズで切り抜けられるにょ。
たとえば σ(^^) にとっての必要なソレは ・・
ところで, 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^)\(☆バキッ)