【IRIS/Cache】【ターミナル】複数行の処理を実行する

はじめに

IRIS/Cacheターミナル(以降ターミナル)で処理を実行する場合、単一行でしか処理を行う事が出来ません。

forループを多重に実行する際も、単一行で記述する必要があるため、コマンドが冗長化するし記述ミスを発見するのも遅くなってしまいます。

ターミナル上でもクラスの関数のように、複数行で記述出来ないだろうか?
と、思ったことはないでしょうか。

今回は、長くなる処理を複数行に分けて記述し、ターミナル上で実行する方法をご紹介いたします。

記述方法

下記は、ターミナル上で複数行を記述するサンプルになります。

Search	;
	s (flg,code,name)=""
	f { s flg  = $o(^developer.data.SampleI("name",flg)) q:flg=""
	f { s code = $o(^developer.data.SampleI("name",flg,code)) q:code=""
	f { s name = $o(^developer.data.SampleI("name",flg,code,name)) q:name=""
		w !,flg,",",code,",",name
	}}}

プロシージャ「Search」を設定し、「Search[Tab]」と入力します。
 ※「Search」の後の「;」には特に意味はありません。
  「Search」と「;」の間にある[Tab]が今回のキーとなります。
後は、各行の先頭に[Tab]を入力してから、処理を記述していくだけです。

パット見たら、ちょっとした関数の様ですね。
これで、長ったらしく記述するしかなかったターミナルのコマンドも、可読性が高くなり保守性が上がると思います。

実行方法は、プロシージャ「Search」なので「d Search」とターミナルに入力するだけです。

d Search

引数を渡して処理を行いたい

Argument(text)	;
	w !,"テスト出力:"_text

処理を記述していくと、引数を渡して汎用性のある作りにしたくなります。

その時はプロシージャに引数「([引数1], [引数2], …」を追記するだけでOKです。
様々な言語でも、引数と言えば大体この形で設定しますよね。
とても見慣れた書き方です(笑

では、ターミナルで出力してみます。

d Argument("出力してみる!!")
テスト出力:出力してみる!!

受け取った引数と、内部で設定している処理をあわせて、ターミナルに出力されました。

これで、ターミナルで汎用的で複雑な処理が出来るようになりました!
ターミナル作業が捗りますね。

戻り値の設定だっていけます!

returnVal(text)	;
	q "戻り値:"_text

w $$returnVal("テスト入力") // -> 戻り値:テスト入力

returnVal2()	;
	q "引数無し"
w $$returnVal2() // -> 引数無し

プロシージャに「()」を付け、処理の最後に「quit」で戻り値を設定します。

引数に関しては、必要であれば記載して下さい。
引数が不要であっても「()」は必須になります。

呼び出す時は、プロシージャの前に「$$」をつけてます。
呼び出し方は一般的なプロシージャと変わりません。
変数に取得するのであれば「set」分を活用して下さい。

今後改善して欲しい点

この記述方法はとても便利ですが、記述ミスがあったとしても、それを修正する手段がありません。
何かしら修正する方法が欲しいですね。

例えば下記サンプルの様に、後から同じ名前のプロシージャを記述したとしても、処理を上書きする事ができません。

failure(text)	;
	w !,"元設定:"_text

failure(text)	;
	w !,"修正後:"_text

d failure("どっちなんだい!") // -> 元設定:どっちなんだい!

k
q
d failure("どっちなんだい!") // -> 元設定:どっちなんだい!

このように、後から上書きしようとしても、最初に設定した処理が動作してしまいます。

また、「kill」文や「quit」文を途中で挟んだとしても、設定したプロシージャが消える事はありません。

ターミナルのツールバーにある「編集」にある機能、「リセット(R)」や「削除(E) (Ctrl + Del)」でも、設定したプロシージャを削除する事が出来ません。

現時点で解決する方法は、下記2点しか思いつきません。

  • プロシージャを変更して作り直す
  • ターミナルの再起動を行う

まぁ、所詮ターミナルなので、再起動自体は全く苦にならないのが救いですね。
ターミナルの簡単起動は、下記記事で記載しているので良ければ参照して下さい。

ターミナルで実行する際は、一旦メモ帳などに記載して良く確認してから張り付けると、失敗がグッと減るのでお勧めです。

まとめ

ルーチンやクラスの関数で記載できる事は、大体この記載方法で対応が可能です。

「クラスを作っても本番環境へリリースするのが手間」だったり、「クラスを作ってまで実行するのが面倒だ」、と言う時にターミナルを使って実行するととても便利です。

メモ帳等に色々ため込んでおくと、いざと言う時に役に立つかもしれませんね。

この記述方法を知らない時代は、本当に大変でした・・・。
記述を短くするために、グローバルの部分を間接参照にしたりとか、色々工夫しました。

s (flg,code,name)=""
s gbl = $na(^developer.data.SampleI("name"))
f { s flg = $o(@gbl@(flg)) q:flg=""  f { s code = $o(@gbl@(flg,code)) q:code=""  f { s name = $o(@gbl@(flg,code,name)) q:name=""  w !,flg,",",code,",",name  }}}

最初の例で言えば、これをターミナルで記述してましたからね。
作業効率が全然変わってきます。

何かしら、皆さまのお役に立てれれば嬉しいです。