#IRIS Object Script※ルーチンの動作をブラウザで確認
#組み込みPythonの概要を把握するまでの所要:1時間
#コマンドの基礎を学んで自作のルーチンを動かすまでの所要:2時間
2hチュートリアル
🔰
エムウェブ2hのチュートリアルは
IRISとPython習得のための学習プログラムで、
エムウェブ2hの開発メソッドを用いて
IRISとPythonで書かれています。
このURLから⤵
https://rooster.m-tone.pink/m2h/xyz/kick.htm
開いたらさっそく
はじめの画面で
プログラムの名前
_t901
を
セットして「実行」してみましょう。
手入力してもよいですが
t901 t902 t903 t904 t905 t906 ‥‥
と
ずらっとわけわからん文字が並んでいる中の
t901
の
文字部分をクリックすると
自動的に入力されることになってます。
「実行」をクリックすると
>実行後に最初の画面に戻るにはページを再読みこみしてください!
と
アラートに表示されますが、
そこはスナオに「OK」で。
結果
Hello, world!
が
無事に表示されたら
これが
「エムウェブ2h」の
原型ということで。
短いながらも
1個のプログラムが稼働して結果が出たわけで、
めでたいことです。
🔰
次に進むには?
ページを リロードすれば戻れる
ってことを
を
ここで覚えておきましょう。
リロードとは?
ページを
もういっかい読み直し(再読込)することですね。
初心者なら
ブラウザの左上にある
このマーク⤵
を
押してもいいですが、
この操作には
ショートカットキー
ってものがあって
いちいちマウスを使わなくても
Ctrl+R
や
F5キー
で
ページ更新できます。
(リロード も
再読込 も 更新も
同じ意味で使われます。)
ま、とにかく、
はじめのこのページに戻りましたね?
このページが
2hチュートリアルのトップ
なのですが、
さっきは
Hello, world!
が
表示されていた画面で
リロードしたのだから
ほんとうなら
もういっぺん
Hello, world!
が
出てこないとあかんのんちゃうの?
‥‥みたいな違和感
は
いったん脇に置いといて、
ともかく
チュートリアルのトップへは
ページの リロード で
いつでも戻れると覚えておいてください。
🔰
そのうちプログラムのほうで気を利かせて
親切に
こんなふうに⤵
オレンジ色の「戻る」アイコンを
表示してくれるようになります。
いまはないけど
そのうちあらわれますので、
そしたらこれを
クリックして戻るとよいです。
エムウェブ2hのチュートリアルは
IRISとPython習得のための学習プログラムで、
エムウェブ2hの開発メソッドを用いて
IRISとPythonで書かれています。
このURLから⤵
https://rooster.m-tone.pink/m2h/xyz/kick.htm
開いたらさっそく
はじめの画面で
プログラムの名前
_t901
を
セットして「実行」してみましょう。
手入力してもよいですが
t901 t902 t903 t904 t905 t906 ‥‥
と
ずらっとわけわからん文字が並んでいる中の
t901
の
文字部分をクリックすると
自動的に入力されることになってます。
「実行」をクリックすると
>実行後に最初の画面に戻るにはページを再読みこみしてください!
と
アラートに表示されますが、
そこはスナオに「OK」で。
結果
Hello, world!
が
無事に表示されたら
これが
「エムウェブ2h」の
原型ということで。
短いながらも
1個のプログラムが稼働して結果が出たわけで、
めでたいことです。
🔰
次に進むには?
ページを リロードすれば戻れる
ってことを
を
ここで覚えておきましょう。
リロードとは?
ページを
もういっかい読み直し(再読込)することですね。
初心者なら
ブラウザの左上にある
このマーク⤵
を
押してもいいですが、
この操作には
ショートカットキー
ってものがあって
いちいちマウスを使わなくても
Ctrl+R
や
F5キー
で
ページ更新できます。
(リロード も
再読込 も 更新も
同じ意味で使われます。)
ま、とにかく、
はじめのこのページに戻りましたね?
このページが
2hチュートリアルのトップ
なのですが、
さっきは
Hello, world!
が
表示されていた画面で
リロードしたのだから
ほんとうなら
もういっぺん
Hello, world!
が
出てこないとあかんのんちゃうの?
‥‥みたいな違和感
は
いったん脇に置いといて、
ともかく
チュートリアルのトップへは
ページの リロード で
いつでも戻れると覚えておいてください。
🔰
そのうちプログラムのほうで気を利かせて
親切に
こんなふうに⤵
オレンジ色の「戻る」アイコンを
表示してくれるようになります。
いまはないけど
そのうちあらわれますので、
そしたらこれを
クリックして戻るとよいです。
ルーチンの確認と編集
🔰
このルーチン(≓プログラム)の名前は
^t901
なのですが、
エムウェブ2hのコーディングでは
「 ^ 」の部分を 「 _ 」に置き換えて指定する場面が多い
‥‥と覚えてください。
さっそく
vscodeでルーチンを開いて
ソースコードを確認しておきましょう。
同じように
^t902
も
実行して
結果を確認した後
ルーチンを開いてソースコードを確認します。
^t903
も
コードの意味、
コマンドの意味は、
まだ理解しようとしなくてもよろしいです。
むずかしいことはあとまわし。
あとまわし
で
よいのですが
ただ、
この3つのプログラムは
見かけはかなりちがっているのに
やっていることはまったく同じで
実行結果もまったく同じだ
ってことだけ
よ~く覚えておいてください。
🔰
^t904
では
「クラスメソッド」という耳慣れない用語が出てきますが
ルーチンから呼び出す外部関数みたいなもの
という理解でよいです。
むずかしいことは
あとまわしでよいですが
ここから呼び出されるクラスメソッド
xyz.t001
の
中味がどんなものかは見ておきましょう。
クラスメソッドのファイルは
ルーチンのファイルよりひとつ下の階層の
「xyz」と書いてあるフォルダのようなものの中にあるので
そこをクリックして展開。
e71.cls
e72.cls
e73.cls
e74.cls
e75.cls
:
:
と
ファイルが並んでいるのが見えますね?
これから開きたい t001.cls は
もっとずーっと下のほうにあります。
開くと
次のようなコードであるとわかります。
ここで
「・・・・・・」の部分は
自動生成されるコードで
Storage Default
となっていますが
意味はわからなくてもよいし、
先々ずーっと 永久に無視してよいです。
すでに相当むずかしいことを
なかなかハイペースで並び立てていますが、
ほんとうに、
むずかしいことは
なんせあとまわしでよいです。
あとまわし
でいいんですが
押さえておいてほしいのは
さっきのルーチン ^t901 から ^t903
まで
と
この ^t904 と次の ^t905
まで、
実行結果はどれも同じ
ということだけ、
気にとめておいてください。
このルーチン(≓プログラム)の名前は
^t901
なのですが、
エムウェブ2hのコーディングでは
「 ^ 」の部分を 「 _ 」に置き換えて指定する場面が多い
‥‥と覚えてください。
さっそく
vscodeでルーチンを開いて
ソースコードを確認しておきましょう。
t901 ;;
;M-tone;20220709;SHZ;エムウェブ2hの最短構成
;<br />
S g="~~<form id=kickform>Hello, world!</form>"
Q
同じように
^t902
も
実行して
結果を確認した後
ルーチンを開いてソースコードを確認します。
t902 ;;
;M-tone;20220709;SHZ;2hプログラミング基本形;意味は^t901と同じ<br />
;
S h2="<form id=kickform>"
S h2=h2_"Hello, world!"
S h2=h2_"</form>"
S g="~~"_h2
Q
^t903
も
t903 ;;
;M-tone;20220709;SHZ;html書き出しに変数を使わずテキストでベタ書きする方法
;
S h2=$$stringify^gREST("htm^t903")
S g="~~"_h2
Q
htm ;;
/*
<form id=kickform>
Hello, world!
</form>
*/
コードの意味、
コマンドの意味は、
まだ理解しようとしなくてもよろしいです。
むずかしいことはあとまわし。
あとまわし
で
よいのですが
ただ、
この3つのプログラムは
見かけはかなりちがっているのに
やっていることはまったく同じで
実行結果もまったく同じだ
ってことだけ
よ~く覚えておいてください。
🔰
^t904
では
「クラスメソッド」という耳慣れない用語が出てきますが
ルーチンから呼び出す外部関数みたいなもの
という理解でよいです。
t904 ;;
;M-tone;20220709;SHZ;クラスメソッドを呼び出す;結果は同じ
;
S h2="<form id=kickform>"
S h2=h2_##class(xyz.t001).mweb() ;"Hello, world!" をセットするだけ
S h2=h2_"</form>"
S g="~~"_h2
Q
むずかしいことは
あとまわしでよいですが
ここから呼び出されるクラスメソッド
xyz.t001
の
中味がどんなものかは見ておきましょう。
クラスメソッドのファイルは
ルーチンのファイルよりひとつ下の階層の
「xyz」と書いてあるフォルダのようなものの中にあるので
そこをクリックして展開。
e71.cls
e72.cls
e73.cls
e74.cls
e75.cls
:
:
と
ファイルが並んでいるのが見えますね?
これから開きたい t001.cls は
もっとずーっと下のほうにあります。
開くと
次のようなコードであるとわかります。
Class xyz.t001 Extends %Persistent
{
ClassMethod mweb()
{
s str = "Hello, world!"
return str
}
・・・・・・
}
ここで
「・・・・・・」の部分は
自動生成されるコードで
Storage Default
となっていますが
意味はわからなくてもよいし、
先々ずーっと 永久に無視してよいです。
すでに相当むずかしいことを
なかなかハイペースで並び立てていますが、
ほんとうに、
むずかしいことは
なんせあとまわしでよいです。
あとまわし
でいいんですが
押さえておいてほしいのは
さっきのルーチン ^t901 から ^t903
まで
と
この ^t904 と次の ^t905
まで、
実行結果はどれも同じ
ということだけ、
気にとめておいてください。
公開サーバ使用上のルール
🔰
エムウェブ2hの
チュートリアル目的サーバは
rooster
という名前の 公開サーバ。
オープン環境であり
このガイドで情報を共有した人であれば
誰でも環境を共有しながら
無料で
エムウェブ2h=IRIS+Python
の
プログラミング
を
体験できるしくみが整えられています。
次のステージへステップアップするための
基本トレーニングの場と考えていただければ。
少しスキルが上がってくると、
ひとりにひとつずつ
専用の環境が無料で提供されますが
この段階ではまだ
ひとつの環境を全員で共有して使っていただきます。
そこでやはり
最低限のルール
というか マナーが必要になってくるわけです。
オープンとはいえ
自由な権限が最大限に認められているので
サーバに用意された
サンプルプログラムにも
自由にアクセスでき
ソースコードを閲覧でき
書き換えることもできてしまう。
できてしまうけれどもやってはダメです。
ルールとして
自分以外の誰かが編集中のプログラムには
変更を加えずそっとしておくこと。
削除することも不可です。
自分が書いたプログラムは
他の人も見ることができるので
見られることに抵抗があるなら自分でそのつど
自分の書いた部分だけ片づけて元に戻すように。
小文字のeから始まる
ルーチン(拡張子:int)とクラスメソッド(拡張子:cls)は
トレーニング用なので自由に編集してよいものとします。
e11.int
e12.int
e13.int
e14.int
e15.int
:
:
e71.cls
e72.cls
e73.cls
e74.cls
e75.cls
:
:
については
2か月を超えて放置されているファイルがあれば
運用責任者が初期状態に戻すことがあります。
データに関しては
トレーニングという性質上
書き込んだり変更したり
削除したりする必要もあるので
ゆるやかな制限しかありません。
理解はあとまわしでよいので
見よう見まねで
プログラムを書いて動かして
実行結果の確認をくりかえすのが上達の秘訣です。
かなりの確率で、
ここで挫折してしまったり
興味を失ってしまうのはやむをえませせんが、
なんとか踏んばっていただきたいです。
エムウェブ2hの
チュートリアル目的サーバは
rooster
という名前の 公開サーバ。
オープン環境であり
このガイドで情報を共有した人であれば
誰でも環境を共有しながら
無料で
エムウェブ2h=IRIS+Python
の
プログラミング
を
体験できるしくみが整えられています。
次のステージへステップアップするための
基本トレーニングの場と考えていただければ。
少しスキルが上がってくると、
ひとりにひとつずつ
専用の環境が無料で提供されますが
この段階ではまだ
ひとつの環境を全員で共有して使っていただきます。
そこでやはり
最低限のルール
というか マナーが必要になってくるわけです。
オープンとはいえ
自由な権限が最大限に認められているので
サーバに用意された
サンプルプログラムにも
自由にアクセスでき
ソースコードを閲覧でき
書き換えることもできてしまう。
できてしまうけれどもやってはダメです。
ルールとして
自分以外の誰かが編集中のプログラムには
変更を加えずそっとしておくこと。
削除することも不可です。
自分が書いたプログラムは
他の人も見ることができるので
見られることに抵抗があるなら自分でそのつど
自分の書いた部分だけ片づけて元に戻すように。
小文字のeから始まる
ルーチン(拡張子:int)とクラスメソッド(拡張子:cls)は
トレーニング用なので自由に編集してよいものとします。
e11.int
e12.int
e13.int
e14.int
e15.int
:
:
e71.cls
e72.cls
e73.cls
e74.cls
e75.cls
:
:
については
2か月を超えて放置されているファイルがあれば
運用責任者が初期状態に戻すことがあります。
データに関しては
トレーニングという性質上
書き込んだり変更したり
削除したりする必要もあるので
ゆるやかな制限しかありません。
理解はあとまわしでよいので
見よう見まねで
プログラムを書いて動かして
実行結果の確認をくりかえすのが上達の秘訣です。
かなりの確率で、
ここで挫折してしまったり
興味を失ってしまうのはやむをえませせんが、
なんとか踏んばっていただきたいです。
組み込みPython──はじめの一歩
🔰
あらためて
エムウェブ2hのチュートリアルへは⤵
このURLから⤵
https://rooster.m-tone.pink/m2h/xyz/kick.htm
はじめの画面で
こんどは
プログラムの名前
_t905
を
セットして「実行」してみましょう。
手入力してもよいですが
t901 t902 t903 t904 t905 t906 ‥‥
と
ずらっとわけわからん文字が並んでいる中の
t905
の
文字部分をクリックすると
自動的に‥‥
ってことは学習済みですね。
、、、
、、、
Hello, world!
が
無事に表示されました?
よね?
、、、
、、、
ですが
t904
までと
何も変わらない結果で
、、、
飽きますね。
t905 ;;
;M-tone;20220709;SHZ;組み込みPython使用例
;
S h2="<form id=kickform>"
S h2=h2_##class(xyz.t002).mweb() ;"Hello, world!" をセットするだけ;ただし言語はPython
S h2=h2_"</form>"
S g="~~"_h2
Qt905
は
t904 とくらべると
##class(xyz.t002).mweb()
の
行が
xyz.t001 から xyz.t002
に
替わっただけ。
つまり
呼び出しているクラスメソッドがちがうわけです。
xyz.t002
の
コードを確認してみると
なにやらPython言語を示すらしい記述が?
Class xyz.t002 Extends %Persistent
{
ClassMethod mweb() [ Language = python ]
{
import iris
str = 'Hello, world!'
return str
}
・・・・・・
}これでは簡単すぎて
Pythonだかなんだかわからないので
ここで
xyz.t004
も
見ておきましょう。
Class xyz.t004 Extends %Persistent
{
ClassMethod mweb(p) [ Language = python ]
{
import iris
str = p
if str == "":
str="Hello, world!"
return str
}
・・・・・・
}これ、
ちょっとだけ Python ぽいですよね。
パラメータを指定して実行すると
Hello, world!
以外の文字が表示される意図らしいことが
‥‥わかります?
これを呼び出して実行するルーチンは
t907
なので
パラメータを入力して試してもらいたい。
チュートリアルのトップで
プログラムの名前として
_t907
を。
かつ、
パラメータとして
たとえば
Python勉強中!
とか
セットして実行。
結果が
Hello, world!
じゃないことが確認できたらオッケーです。
Pythonライブラリの活用
🔰
ルーチン ^t908
クラスメソッド xyz.t005
は
Pythonのライブラリとしてはよく知られた
OpenPyXL
の
活用事例です。
チュートリアルのトップで
プログラムの名前として
_t908
を
セットして
パラメータなしで実行すると
hello.xlsx
という
エクセルのファイルがサーバで生成されて
ダウンロードできます。
サーバにはエクセルはインストールされてないのに
エクセルのファイルができてしまうところが
ちょっとおもしろいかなと。
「いまここ」は
D列11行めのセルで
Hello, world!
なんですが、
パラメータを指定すると
ここの文字が
Hello, world!
ではなくなって
エクセルがライブで生成されたことが
いっそうハッキリわかります。
🔰
ルーチン ^t909
クラスメソッド xyz.t006
も
さっきの事例と同様に
OpenPyXL
の
活用事例。
なんですが、
xyz.t006
は
わりと手の込んだ仕掛けを加えてあるので、
ちょっと教材価値あります。
というのも
ひとつのクラスの中に
Python言語で書かれた
mwebPython
と
IRIS ObjectScript言語で書かれた
mwebIRIS
を
並べて同居させて
これを
パラメータで使い分けるような
つまらない遊び心が足してあります。
チュートリアルのトップで
プログラムの名前として
_t909
を
セットして
パラメータなしで実行すると
mwebIRIS
が動作します。
※
キャッシュのせいで
新しく作成されたファイルが
うまくダウンロードできないので
キャッシュのクリアを
マメにやってもらいたいですが。
プログラムの名前を
同じ
_t909
として
パラメータに
またまた
Python勉強中!
として
実行してみよう。
こんな感じ⤵
するとこんどは
xyz.t006
の
mwebPython
のほうが実行されます。
つまり、
デフォルトでは
mwebIRIS
が呼ばれますが
「Python」(または「python」)を含む文字列が
パラメータとして渡されると
mwebPython
が呼ばれるようにしてあるわけです。
ほんまにつまらん遊び心ですね。
ルーチン ^t908
クラスメソッド xyz.t005
は
Pythonのライブラリとしてはよく知られた
OpenPyXL
の
活用事例です。
チュートリアルのトップで
プログラムの名前として
_t908
を
セットして
パラメータなしで実行すると
hello.xlsx
という
エクセルのファイルがサーバで生成されて
ダウンロードできます。
サーバにはエクセルはインストールされてないのに
エクセルのファイルができてしまうところが
ちょっとおもしろいかなと。
「いまここ」は
D列11行めのセルで
Hello, world!
なんですが、
パラメータを指定すると
ここの文字が
Hello, world!
ではなくなって
エクセルがライブで生成されたことが
いっそうハッキリわかります。
🔰
ルーチン ^t909
クラスメソッド xyz.t006
も
さっきの事例と同様に
OpenPyXL
の
活用事例。
なんですが、
xyz.t006
は
わりと手の込んだ仕掛けを加えてあるので、
ちょっと教材価値あります。
というのも
ひとつのクラスの中に
Python言語で書かれた
mwebPython
と
IRIS ObjectScript言語で書かれた
mwebIRIS
を
並べて同居させて
これを
パラメータで使い分けるような
つまらない遊び心が足してあります。
チュートリアルのトップで
プログラムの名前として
_t909
を
セットして
パラメータなしで実行すると
mwebIRIS
が動作します。
※
キャッシュのせいで
新しく作成されたファイルが
うまくダウンロードできないので
キャッシュのクリアを
マメにやってもらいたいですが。
プログラムの名前を
同じ
_t909
として
パラメータに
またまた
Python勉強中!
として
実行してみよう。
こんな感じ⤵
するとこんどは
xyz.t006
の
mwebPython
のほうが実行されます。
つまり、
デフォルトでは
mwebIRIS
が呼ばれますが
「Python」(または「python」)を含む文字列が
パラメータとして渡されると
mwebPython
が呼ばれるようにしてあるわけです。
ほんまにつまらん遊び心ですね。
IRISとPythonの融合
🔰
ルーチン ^t910
では
クラスメソッド xyz.t007
を
呼び出して実行しますが、
こちらは
Pythonライブラリ
ReportLab
の
活用事例です。
ReportLab
は
PDFドキュメントを生成する
Pythonの強力なライブラリで
エムウェブ2hの帳票出力機能としても
がっつり全面的に取り入れられています。


2022年6月3日
インターシステムズから届いたメールの中味(抄)を確認してみると──
🔻🔻🔻
発行: 2022年06月03日
-- InterSystems News Vol.315 ------------------------------------------
InterSystems 製品 2022.1 リリースのご案内
------------------------------------------------------- InterSystems --
インターシステムズは、InterSystems IRIS データ・プラットフォーム、
InterSystems IRIS for Health 、HealthShare Health Connect のメジャー
バージョン 2022.1 をリリースしました。
リリースのハイライト:
開発環境の改善
- Embedded Python - IRIS 内部で Python と ObjectScript が使用可能になります
🔺🔺🔺
すなわちこのへんが
バージョン2022.1のハイライトだとわかりますね。
この2hガイドを執筆している7月の時点で
特に新鮮なコンテンツとして注目してもらいたいのは
次のクラスメソッド
xyz.t007
で
Python と IRIS ObjectScript
の
2つの言語を対比させながら
同じロジックで同じ処理を実行している点です。
(インターシステムズのサポート担当、
中橋さんに手伝ってもらったので
xyz.t006
より
いっそう対比がわかりやすいはずです。)
これってつまり
Python だけ使えて IRIS ObjectScript は知らないプログラマでも
クラスメソッド作成という業務分担を通じて
プロジェクトに参画できる(別途「パイソン拡張」ページで検証)。
ってことを意味しています。
逆に
IRIS ObjectScript だけ知っていて
ほとんど Python 使えないプログラマでも
簡単な書式パターンを知っておくだけで
Python の豊富なライブラリを活用できるということ。
embedded ということは
両言語が仲良く
perfect に together ということで
プログラマは
いずれかの言語のうちひとつが使えたら足りるっってわけで。
すばらしい。
プログラムの名前を
同じ
_t910
として
パラメータなしで実行すると
さっきの
_t909
とは反対に
デフォルトでは
mwebPython
が呼ばれます。
パラメータに
IRIS勉強中!
とか
「IRIS」を含む文字列が渡されると
mwebIRIS
が呼ばれます。
ルーチン ^t910
では
クラスメソッド xyz.t007
を
呼び出して実行しますが、
こちらは
Pythonライブラリ
ReportLab
の
活用事例です。
ReportLab
は
PDFドキュメントを生成する
Pythonの強力なライブラリで
エムウェブ2hの帳票出力機能としても
がっつり全面的に取り入れられています。


2022年6月3日
インターシステムズから届いたメールの中味(抄)を確認してみると──
🔻🔻🔻
発行: 2022年06月03日
-- InterSystems News Vol.315 ------------------------------------------
InterSystems 製品 2022.1 リリースのご案内
------------------------------------------------------- InterSystems --
インターシステムズは、InterSystems IRIS データ・プラットフォーム、
InterSystems IRIS for Health 、HealthShare Health Connect のメジャー
バージョン 2022.1 をリリースしました。
リリースのハイライト:
開発環境の改善
- Embedded Python - IRIS 内部で Python と ObjectScript が使用可能になります
🔺🔺🔺
すなわちこのへんが
バージョン2022.1のハイライトだとわかりますね。
この2hガイドを執筆している7月の時点で
特に新鮮なコンテンツとして注目してもらいたいのは
次のクラスメソッド
xyz.t007
で
Python と IRIS ObjectScript
の
2つの言語を対比させながら
同じロジックで同じ処理を実行している点です。
(インターシステムズのサポート担当、
中橋さんに手伝ってもらったので
xyz.t006
より
いっそう対比がわかりやすいはずです。)
これってつまり
Python だけ使えて IRIS ObjectScript は知らないプログラマでも
クラスメソッド作成という業務分担を通じて
プロジェクトに参画できる(別途「パイソン拡張」ページで検証)。
ってことを意味しています。
逆に
IRIS ObjectScript だけ知っていて
ほとんど Python 使えないプログラマでも
簡単な書式パターンを知っておくだけで
Python の豊富なライブラリを活用できるということ。
embedded ということは
両言語が仲良く
perfect に together ということで
プログラマは
いずれかの言語のうちひとつが使えたら足りるっってわけで。
すばらしい。
Class xyz.t007 Extends %Persistent
{
ClassMethod mwebPython(fname, str) As %Status [ Language = python ]
{
from reportlab.pdfgen import canvas
from reportlab.lib import pagesizes
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase import ttfonts
pdfsize = pagesizes.portrait(pagesizes.A4)
canvas = canvas.Canvas(fname,pdfsize)
pdfmetrics.registerFont(ttfonts.TTFont('Meiryo UI', 'C:/Windows/fonts/Meiryo.ttc'))
canvas.setFont('Meiryo UI', 24)
if str=='':
str='エムウェブ2h'
canvas.drawString(30, 780, "ReportLabで日本語をPDFに")
canvas.drawString(30, 750, str)
canvas.drawString(30, 720, "※使用言語:Python")
canvas.drawImage('C:/M-tone/m2h/xyz/yorokondeitadakimasho.jpg', 10, 480)
canvas.save()
}
ClassMethod mwebIRIS(fname, str) As %Status
{
set canvas = ##class(%SYS.Python).Import("reportlab.pdfgen.canvas")
set pagesizes=##class(%SYS.Python).Import("reportlab.lib.pagesizes")
set pdfmetrics = ##class(%SYS.Python).Import("reportlab.pdfbase.pdfmetrics")
set ttfonts = ##class(%SYS.Python).Import("reportlab.pdfbase.ttfonts")
set pdfsize = pagesizes.portrait(pagesizes.A4)
set canvas = canvas.Canvas(fname,pdfsize)
do pdfmetrics.registerFont(ttfonts.TTFont("Meiryo UI","c:/Windows/fonts/Meiryo.ttc"))
do canvas.setFont("Meiryo UI", 24)
set:str="" str="エムウェブ2h"
do canvas.drawString(30, 780, "ReportLabで日本語をPDFに")
do canvas.drawString(30, 750, str)
do canvas.drawString(30, 720, "※使用言語:IRIS ObjectScript")
do canvas.drawImage("C:/M-tone/m2h/xyz/yorokondeitadakimasho.jpg", 10, 480)
do canvas.save()
}
・・・・・・
}
プログラムの名前を
同じ
_t910
として
パラメータなしで実行すると
さっきの
_t909
とは反対に
デフォルトでは
mwebPython
が呼ばれます。
パラメータに
IRIS勉強中!
とか
「IRIS」を含む文字列が渡されると
mwebIRIS
が呼ばれます。
入門IRIS
🔰
IRISのコマンドプロンプトまでの手順を手短に復習しておくと
1.vscode起動
2.「ターミナル」メニューから「新しいターミナル」
3.PowerShellのプロンプトで:telnet
4.Microsoft Telnetのプロンプトで:open rooster.m-tone.pink
5.Username:XYZdev
6.Password:xyz99
これで
XYZ>
と表示されたらOK。
コマンドプロンプトでは
上下の矢印キーで
過去の入力履歴(コマンドヒストリー)を表示させることができて
再実行もできることを知っておきましょう。
🔰
XYZ>s a=3,b=5,c=8
と書いて
XYZ>w
と
すると
a=3
b=5
c=8
と表示されます。
これは3つの変数に値がセットされた状態で
次に
XYZ>k a
とし、
また
XYZ>w
と
すると
b=5
c=8
となっていて
a がなくなっていることがわかります。
以上の説明で
R、W、K、Sの4つが理解できた、、、
でしょうか??
現在のIRIS ObjectScriptは
マンプス(Mumps)という言語が起源でして。
プログラミング言語のマンプスについては
いちど調べてみる価値があります。
のちにM言語(M Language)と呼ばれたこともあり
これが
エムウェブの「エム」はここに由来しています。
ま、
どうでもいいかもしれないですが、、、
ObjectScriptは
マンプスを
インターシステムズが仕様拡張して自社製品としたものです。
エムウェブは
まだ ObjectScript が存在しなかった時代に生まれたので
グローバル変数(データベース)の扱いも
ネイティブなマンプスそのもの。
オブジェクト指向ではないし
ゆえに2h世代(2021年リリース)までは
クラス定義もありません。
マンプスのコマンドは異常にカンタンで強力なので
わずか数時間のレッスンで
実用的なルーチンを書くことができます。
カンタンだから初心者に向いている
と
いわれているPythonの10倍カンタン。
すべて把握するのに3日とかかりません。
ただ、
プログラマーと言語のあいだにも相性があり、
マンプスはある意味、非常に個性の強い言語です。
クセが強すぎるかもしれません。
なのでまずは
この言語の特性を好きになれるかどうか、
コマンドプロンプトでコマンド打ちこんで試してみましょう。
🔰
IRISのルーチンを開くまでの手順を手短に復習しておくと
1.vscode起動
2.サイドバーにある InterSystems Tools のアイコンをクリック
3.All Servers から rooster を選択
4.Username:XYZdev(※パスワードはすでに記憶させているとする)
5.Namespaces から XYZ を選択してエンピツのアイコンをクリック
6.またUsername:XYZdev
7.ルーチン一覧が表示される(※クラスメソッドは「xyz」フォルダの中)
これで
e11.int、e12.int、e13.int、、、
が
ずらっと表示されたらOK。
クラスメソッドは xyz フォルダの中にあるので
e71.cls、e72.cls、e73.cls、、、
が見えたらOK。
🔰
コマンド習得を目的として
ルーチン
^t912
が
準備されております。
コマンドが理解できるまでの最短の近道は
すでにあるソースコードを目で見て
実行させてみて
結果がどうなるかを確認すること
(※ただしこのルーチンは編集不可)です。
こう書けば、こう動く
を
すぐやってみて、すぐ見くらべて体感
の
くりかえしをオススメします。
自前で書くのがむずかしいあいだは、
すでにできあがっているルーチンの一部を
少しアレンジする練習がよいです。
ウラでこう書けば、オモテがこう動く
の
体感。
ウラとは
vscodeでルーチンを開いたら見えているソースコード。
オモテとは、
ブラウザ上でエムウェブを稼働させたときに見えているものです。
では、
vscodeで ^t912 を開いて
ソースコードを眺めながら
コマンドプロンプトから
XYZ>d try^t912
と
打ちこんでください。
これは
ルーチン
^t912
の
ラベル
try
を
実行するという意味です。
で?
結果は?
、、、
また
性懲りもなく
Hello, world!
が
表示されました。
飽きたでしょうけど、
そこをグッとこらえて
次は
XYZ>d try101^t912
を実行。
何をやってるかは、
一瞬で理解できるはずなので
次は
XYZ>d try102^t912
へ。
そして次は、、、
🔰
ルーチン
^t912
の
ラベル
try201
ってとこ。
ここで初めて
自力でプログラムを書いてみることを
推奨します。
自作用に
^e11
から
^e55
まで
Hello, world!
が
表示されるだけの
^t902
と
そっくりな
ルーチンがあります。
これがテンプレートです。
どれでも適当に開いて
自分なりにアレンジしてほしいという意図があるのですが、
他の誰かが編集した形跡があれば
^e11~^e55のうち
どれか手つかずの別のルーチンを開いてもらえたら。
(自分が作成中とかで
そのままそっとしといてほしいルーチンは
その旨をコメントに書いてわかるようにしておくといいでしょう。)
次のルーチンの
🔻から🔺までのあいだに
自作プログラムを書いて
コマンドプロンプトで実行してみてください。
これは
ブラウザで実行するのが前提のテンプレートですが、
XYZ>d ^e11
のように
コマンドプロンプトで実行しても問題ありません。
どこも変更しなければ何も表示されませんが、
すべて練習ですから。
たとえば
try201^t912
を
コピペして少しだけ変えてみると──
この要領で
書いて実行して
また書き直してまた実行して‥‥
XYZ>d try301^t912
XYZ>d try302^t912
XYZ>d try303^t912
XYZ>d try401^t912
:
:
と
理解しながら
どんどん進めましょう。
XYZ>d ^e12
XYZ>d ^e13
XYZ>d ^e14
XYZ>d ^e15
:
:
と
どんどん書いて
どんどんセーブして
どんどん実行して
どんどん体感を深めていくだけです。
飽きたら
そこで一服してまたあした。
🔰
IRIS ObjectScriptの変数には
✅ローカル変数
✅グローバル変数
の2つがあり
エムウェブではグローバル変数がデータベースそのものです。
SQL
とか
まったく関係ありません。
ローカル変数の理解は
他の一般的なプログラミング言語における変数と同じ感覚でよいですが
グローバル変数は
一種独特の感覚であり、
IRISの多次元データベースを理解する上での
根幹をなすものといえます。
グローバル変数は
変数のアタマに ^ (キャレット)が付いてます。
反対にいうと、
変数名にキャレットを付けることで
値がグローバル変数としてディスクに書きこまれ
データベースとして保存されることになるわけです。
サーバにアクセスする複数ユーザが等しく共有することができ
読み書きできるデータです。
いっぽう、
ローカル変数は一時的な格納場所なので
用が済んだらkillコマンドで消去するのがよいです。
定義を忘れたらUNDIFINEDのエラーになりますが
消し忘れてもエラーのもと。
ObjectScriptの変数には「型」とかなんとか
ややこしいものを意識する必要はほとんどありません。
数値でも文字列でも同じようにセットできてしまいます。
自分勝手なグローバル変数を
チュートリアル環境でみだりにセットすると
知らないあいだに不要なデータがゴミのようにたまってしまうので
サーバroosterのオープンな場では
自由に変更してよいグローバル変数は当面
^eXYZ
のみとさせていただきます。
この変数に格納されたデータは
チュートリアルのトップページに表示される仕様としてますので
たとえば
XYZ>S ^eXYZ("test")="Hello, world!"
と
入力すれば
実行結果が画面で確認できますね。
※ダブルクォーテーションはブラウザ表示ではシングルに置き換え
IRISのコマンドプロンプトまでの手順を手短に復習しておくと
1.vscode起動
2.「ターミナル」メニューから「新しいターミナル」
3.PowerShellのプロンプトで:telnet
4.Microsoft Telnetのプロンプトで:open rooster.m-tone.pink
5.Username:XYZdev
6.Password:xyz99
これで
XYZ>
と表示されたらOK。
コマンドプロンプトでは
上下の矢印キーで
過去の入力履歴(コマンドヒストリー)を表示させることができて
再実行もできることを知っておきましょう。
🔰
XYZ>s a=3,b=5,c=8
と書いて
XYZ>w
と
すると
a=3
b=5
c=8
と表示されます。
これは3つの変数に値がセットされた状態で
次に
XYZ>k a
とし、
また
XYZ>w
と
すると
b=5
c=8
となっていて
a がなくなっていることがわかります。
以上の説明で
R、W、K、Sの4つが理解できた、、、
でしょうか??
現在のIRIS ObjectScriptは
マンプス(Mumps)という言語が起源でして。
プログラミング言語のマンプスについては
いちど調べてみる価値があります。
のちにM言語(M Language)と呼ばれたこともあり
これが
エムウェブの「エム」はここに由来しています。
ま、
どうでもいいかもしれないですが、、、
ObjectScriptは
マンプスを
インターシステムズが仕様拡張して自社製品としたものです。
エムウェブは
まだ ObjectScript が存在しなかった時代に生まれたので
グローバル変数(データベース)の扱いも
ネイティブなマンプスそのもの。
オブジェクト指向ではないし
ゆえに2h世代(2021年リリース)までは
クラス定義もありません。
マンプスのコマンドは異常にカンタンで強力なので
わずか数時間のレッスンで
実用的なルーチンを書くことができます。
カンタンだから初心者に向いている
と
いわれているPythonの10倍カンタン。
すべて把握するのに3日とかかりません。
ただ、
プログラマーと言語のあいだにも相性があり、
マンプスはある意味、非常に個性の強い言語です。
クセが強すぎるかもしれません。
なのでまずは
この言語の特性を好きになれるかどうか、
コマンドプロンプトでコマンド打ちこんで試してみましょう。
🔰
IRISのルーチンを開くまでの手順を手短に復習しておくと
1.vscode起動
2.サイドバーにある InterSystems Tools のアイコンをクリック
3.All Servers から rooster を選択
4.Username:XYZdev(※パスワードはすでに記憶させているとする)
5.Namespaces から XYZ を選択してエンピツのアイコンをクリック
6.またUsername:XYZdev
7.ルーチン一覧が表示される(※クラスメソッドは「xyz」フォルダの中)
これで
e11.int、e12.int、e13.int、、、
が
ずらっと表示されたらOK。
クラスメソッドは xyz フォルダの中にあるので
e71.cls、e72.cls、e73.cls、、、
が見えたらOK。
🔰
コマンド習得を目的として
ルーチン
^t912
が
準備されております。
コマンドが理解できるまでの最短の近道は
すでにあるソースコードを目で見て
実行させてみて
結果がどうなるかを確認すること
(※ただしこのルーチンは編集不可)です。
こう書けば、こう動く
を
すぐやってみて、すぐ見くらべて体感
の
くりかえしをオススメします。
自前で書くのがむずかしいあいだは、
すでにできあがっているルーチンの一部を
少しアレンジする練習がよいです。
ウラでこう書けば、オモテがこう動く
の
体感。
ウラとは
vscodeでルーチンを開いたら見えているソースコード。
オモテとは、
ブラウザ上でエムウェブを稼働させたときに見えているものです。
では、
vscodeで ^t912 を開いて
ソースコードを眺めながら
コマンドプロンプトから
XYZ>d try^t912
と
打ちこんでください。
これは
ルーチン
^t912
の
ラベル
try
を
実行するという意味です。
で?
結果は?
、、、
また
性懲りもなく
Hello, world!
が
表示されました。
飽きたでしょうけど、
そこをグッとこらえて
次は
XYZ>d try101^t912
を実行。
何をやってるかは、
一瞬で理解できるはずなので
次は
XYZ>d try102^t912
へ。
そして次は、、、
🔰
ルーチン
^t912
の
ラベル
try201
ってとこ。
ここで初めて
自力でプログラムを書いてみることを
推奨します。
自作用に
^e11
から
^e55
まで
Hello, world!
が
表示されるだけの
^t902
と
そっくりな
ルーチンがあります。
これがテンプレートです。
どれでも適当に開いて
自分なりにアレンジしてほしいという意図があるのですが、
他の誰かが編集した形跡があれば
^e11~^e55のうち
どれか手つかずの別のルーチンを開いてもらえたら。
(自分が作成中とかで
そのままそっとしといてほしいルーチンは
その旨をコメントに書いてわかるようにしておくといいでしょう。)
次のルーチンの
🔻から🔺までのあいだに
自作プログラムを書いて
コマンドプロンプトで実行してみてください。
S h2="<form id=kickform>"
;🔻ここから
S h2=h2_"Hello, world!"
;🔺ここまで
S h2=h2_^eXYZ
S h2=h2_"</form>"
S g="~~"_h2
Q
これは
ブラウザで実行するのが前提のテンプレートですが、
XYZ>d ^e11
のように
コマンドプロンプトで実行しても問題ありません。
どこも変更しなければ何も表示されませんが、
すべて練習ですから。
たとえば
try201^t912
を
コピペして少しだけ変えてみると──
S h2="<form id=kickform>"
;
R "あなたの趣味を入力してください→ ",hobby
I hobby="" W "?" Q
W !,hobby,"ですか!"
;
S h2=h2_^eXYZ
S h2=h2_"</form>"
S g="~~"_h2
Q
この要領で
書いて実行して
また書き直してまた実行して‥‥
XYZ>d try301^t912
XYZ>d try302^t912
XYZ>d try303^t912
XYZ>d try401^t912
:
:
と
理解しながら
どんどん進めましょう。
XYZ>d ^e12
XYZ>d ^e13
XYZ>d ^e14
XYZ>d ^e15
:
:
と
どんどん書いて
どんどんセーブして
どんどん実行して
どんどん体感を深めていくだけです。
飽きたら
そこで一服してまたあした。
🔰
IRIS ObjectScriptの変数には
✅ローカル変数
✅グローバル変数
の2つがあり
エムウェブではグローバル変数がデータベースそのものです。
SQL
とか
まったく関係ありません。
ローカル変数の理解は
他の一般的なプログラミング言語における変数と同じ感覚でよいですが
グローバル変数は
一種独特の感覚であり、
IRISの多次元データベースを理解する上での
根幹をなすものといえます。
グローバル変数は
変数のアタマに ^ (キャレット)が付いてます。
反対にいうと、
変数名にキャレットを付けることで
値がグローバル変数としてディスクに書きこまれ
データベースとして保存されることになるわけです。
サーバにアクセスする複数ユーザが等しく共有することができ
読み書きできるデータです。
いっぽう、
ローカル変数は一時的な格納場所なので
用が済んだらkillコマンドで消去するのがよいです。
定義を忘れたらUNDIFINEDのエラーになりますが
消し忘れてもエラーのもと。
ObjectScriptの変数には「型」とかなんとか
ややこしいものを意識する必要はほとんどありません。
数値でも文字列でも同じようにセットできてしまいます。
自分勝手なグローバル変数を
チュートリアル環境でみだりにセットすると
知らないあいだに不要なデータがゴミのようにたまってしまうので
サーバroosterのオープンな場では
自由に変更してよいグローバル変数は当面
^eXYZ
のみとさせていただきます。
この変数に格納されたデータは
チュートリアルのトップページに表示される仕様としてますので
たとえば
XYZ>S ^eXYZ("test")="Hello, world!"
と
入力すれば
実行結果が画面で確認できますね。
※ダブルクォーテーションはブラウザ表示ではシングルに置き換え
ルーツはMumps
🔰
現在のIRIS ObjectScriptは
マンプス(Mumps)という言語が起源です。
1960年代末に
アメリカのマサチューセッツ総合病院で
医療情報処理用のアプリケーションを開発し実行するために開発されました。
Massachusetts general hospital Utility Multi-Programming System
で
MUMPS(直訳すると「おたふくかぜ」)。
冗談みたいなネーミングですが、
いちど知ってしまえば
他の言語を使うのはアホらしくなるほど
恐ろしくパワフルな言語ですが、
そう聞いてもにわかには信じられないでしょうから、
気の済むまだウラをとってください。
マンプスはもともとコマンドの数が少ないのですが、
さらにエムウェブの開発用途に絞るなら
知っておくべきコマンドは
D、E、F、G、I、K、M、N、Q、R、S、W
の
12個くらい。
ほかのコマンドはほとんど使わないので
知っておく必要なし。
アルファベット1文字であらわされる上記のコマンドは
それぞれ以下の英単語の省略形です。
Do
Else
For
Go
If
Kill
Merge
New
Quit
Read
Set
Write
ソースコードの記述にあたって
たとえば Do は
DO と書いても Do でも do でも D でも d でもドウでもよくて、
1990年代に生まれたエムウェブでは
大文字の省略形 D を用いるのが慣例ではありますが、
後に世間一般で小文字が主流になってきたこともあり
いまどきの表記法に則って
カモメ括弧{ }で区切ってコードを書く場合など
小文字を使うことが増えきています。
つまり小文字が多いほど
新しいルーチンというわけで
トラディショナルな文法と
そこで見分けがついたりします。
必須コマンドの解説は次の表のとおり
‥‥なのですが、
読むとよけいむずかしいので
プログラミングを実践しながら
つどつど覚えていくほうがよいでしょう。
コマンドについての必要な知識が
たったこれだけしかない
ということを知って
なんとなく安心するためのまとめだと思っていただければ。
|
D do |
ルーチンを呼び出して実行する。 D IDT^uDT,ODT^uDT のように記述すると 複数のルーチンを連続して実行させることができる。 また ひとつの同じルーチンの中で使った場合には、 D XYZ のようにラベル名 XYZ だけで呼び出して実行できる。 引数を省略する形式もあり その場合、 クラシックな記述として I A=5 D . S X=1 . S Y=0 . W "OK" のように記述される。 この意味は、 I A=5 S X=1,Y=0 W "OK" と同じで、 かつ、 if A=5 { S X=1 S Y=0 W "OK" } も同じ。 だらだらと横長に記述したくないときに使うと便利なので 使用頻度は高い。 |
|
E else |
IFとセットで使って 条件を満たさないときの処理を指定する。 例えば I A=5 S B=1 E S B=0 のように。 意味は >A の値が 5 なら B に 1 をセットし、 >そうでないなら B に 0 をセットする これを いまどき風に書き改めると if A=5 { S B=1 } else { S B=0 } となる。 |
|
F for |
処理を繰り返して実行するときに使う。 F J=1:1:5 S P(J)=0 と書くと >くりかえしの処理を J が 1 のときから始め >J に 1 ずつ加えながら J が 5 になるまで P(J) に 0 をセットする の意味になる。 F J=1:1 S P(J)=0 Q:J>10 と書くと >くりかえしの処理を J が 1 のときから始め >J に 1 ずつ加えながら P(J) に 0 をセットし続け >J が 10 を超えたら終了 実行結果としては P(11)=0 まで セットされている。 引数が省略された F は いつまでも無限にくりかえして処理を実行する。 同じ処理が別の書き方では S J=0 F S J=J+1,P(J)=0 Q:J>10 となる。 このときの F のうしろにはスペースを2つ空けることに注意する。 またこれは F J=1:1 D Q:J>10 . S P(J)=0 と記述しても同じ意味になるが、 このときの D のうしろもスペースを2つ空ける。 これを いまどき風に書き改めると s J=1 for { S J=J+1 S P(J)=0 Q:J>10 } |
|
G go |
指定するルーチンやラベルの位置へジャンプ。 G TOP^gSLIN と記述すると 別のルーチンの指定するラベルの位置へ処理が移る。 同一ルーチンの中で使った場合には G XYZ のようにラベル名 XYZ だけで移動できる。 使用中のローカル変数はジャンプ先でもそのまま有効。 |
|
I if |
命令を実行する際の条件を指定。 A=1、B=2、C=3 として、 I (A<B)&(B<C) S D=4 と記述すると、 >もし A が B より小さく >かつ B が C より小さければ >D に 4 をセットする しかし I A<B,B<C S D=4 では >もし A が B より小さければ >次の条件判定に進み、 >B が C より小さければ、D に 4 をセットする になる。 どちらの記述でも結果としては成立して D=4 になるが、 後の記述では 条件が左から順に判定されるため A B I A<B S:B<C D=4 と同じである。 「または」の場合は記述はひとつしかないので こんなややこしいことは考えなくてよく 次のように書く。 I (A<B)!(B<C) S D=4 |
|
K kill |
変数を削除する。 どんな大きなデータベースも 「あっ!」というまに削除されるので 実行には細心の注意が必要。 ここに変数 DATA(1,1,1) DATA(1,1,2) DATA(1,1) DATA(1,2) DATA(1) の 5つが定義されているとして K DATA(1,1) では 変数 DATA(1,1) と その下位ノードがすべて削除されて 残りの変数は DATA(1) DATA(1,2) の 2つになる。 K DATA(1) では ぜんぶ消えて何も残らないが それより先に DATA=0 という上位ノードの定義があったとすれば これは消されない。 以上の理屈はグローバル変数でもローカル変数でも同じだが K だけで 引数なしでこのコマンドを使うと すべてのローカル変数を削除する。 K (A,B,C) と書くと 括弧内で指定したローカル変数 A 、 B 、 C 以外の すべてのローカル変数を削除する。 |
|
M merge |
変数の構造ごと丸ごとコピーする。 例えば ^X(1)=0 ^X(1,1)=0 ^X(1,2)=0 ^X(1,1,1)=0 の 4つの変数が定義されているとして M ^Y=^X と 記述すると 変数 ^Y の中味は ^Y(1)=0 ^Y(1,1)=0 ^Y(1,2)=0 ^Y(1,1,1)=0 となる。 M ^Z(9)=^X では ^Z の中味は ^Z(9,1)=0 ^Z(9,1,1)=0 ^Z(9,1,2)=0 ^Z(9,1,1,1)=0 で 指定したノードの下位にそのままの階層がコピーされる。 また ローカル変数とグローバル変数のいずれも同じ理屈で扱うことができ M W=^X(1) で 変数 W の中味は W=0 W(1)=0 W(2)=0 W(1,1)=0 となる。 |
|
Q quit |
D コマンドや F コマンドによる処理やルーチンを終了する。 引数のある場合は 外部関数として呼び出したときにその値を返すので Q FLG なら FLG の値がこの処理の返り値である。 |
|
R read |
データを読みこむ。 RQ X:3 と記述すると 制限時間を指定したことになり データ入力(または返り値など)を3秒待つ。 |
|
S set |
変数に値をセットする。 |
|
W write |
データを出力する。 W "Good morning!",!,"How are you?" で Good morning! How are you? という結果が得られる。 2つめの ! は改行である。 |
🔰
マンプス(Mumps)の用法で、
ものすごく重要なポイントとして
「添字」があります。
添字を付けることで
値をひとまとまりの集合体として扱うことができるのです。
ヘタな説明を聞くとよけいむずかしいので
ターミナルで試してみたほうが早いです。
試しながら読んで、
読みながら試してください。
たとえば
s a=3
とすると
a に 3 がセットされるますが
s a(5)=8
とすると
a(5) が 8 になります。
s a(5,3)=10
とか。
a と a(5) と a(5,3) は
それぞれ独立した変数ですが
a という親の下に上下関係ができあがっていて、
a(5,3) は a(5) の下位ノードであるといいます。
言葉は覚えなくてもよいですが
いわば、a(5,3) と a(5,5) は兄弟で
その親は a(5)だというわけです。
a(5) は a の子なので
a(5,3) と a(5,5) は a の孫‥‥
みたいな。
添字は数字にかぎったものでもなく
a("a")という変数もアリ。
この "a" はアルファベットの1文字ですね。
a("a") と a(5) もやっぱり兄弟分の関係で
a の一族です。
ゆえに
わかりやすい例として
kill a
とすると、
a(5) も a(5,3) も消えてしまいます。
親ガメの背中に子ガメを乗せて~
子ガメの背中に孫ガメ乗せて~
親ガメこけたら皆こける
‥‥ってやつですね、
知らんけど。
kill a(5)
だと
a(5,3) は消えますが a("a") は消えません。
コケる亀あればコケない亀もある
‥‥ってことが理解できるまで
実際にターミナルで打ちこんで
徹底的に試すことが必須です。
変数はいくつでも添字をもつことができ
また
添字の階層はいくら深くてもかまわず
変数自身が別の添字となることもできる。
つまり a=5 であれば
a(a) と a(5) は同じものですが
a(a) と a("a") は別物です。
では
f j=1:1:5 s a(j)=j
というコマンドの実行結果は?
f は他の言語にもよくある for コマンドで
j という変数が 1 からはじめて 1 を加えていって 5 になるまで
a(j) に j をセットし続けなさいというコマンドです。
結果は?
w で確認してみたらわかります。
添字の使い方で、
わかっていてもけっこうやってしまいがちなミスとして
空文字列(ヌル)を添字に使ってしまうとエラーになる
‥‥ってことを最後に覚えておくといいでしょう。
今夜は亀の夢でも見ながらぐっすりお休みください。
🔰
関数については
オフィシャルな日本語ドキュメントの
こちらに記載があるのですが
やはりむずかしすぎるので見ないほうがよいかもです。
座学としては
下記のコンパクトなまとめでじゅうぶんなはずですので、
あとは実践で身につけてください。
|
$case |
指定した変数があれなら、これなら、と、いくつかの条件を並べて、最初に一致した値を返す。 たとえば s prize=$case(xyz,1:"りんご",2:"みかん",3:"くり",:"はずれ") の意味は >xyz が 1 なら「りんご」を、2 なら「みかん」を、3 なら「くり」を、そのどれでもなければ「はずれ」を、prize にセット なので もし xyz=2 なら prize の値は "みかん" である。 |
|
$D $data |
ある変数が存在するかしないか。 たとえば xyz=1 のとき $D(xyz) の値は 1 で xyzがundefined(未定義)なら $D(xyz) は 0 となる。 if文で if '$D(xyz) … と書かれていれば if $D(xyz)=0 … と同じ。 この関数はundefinedのエラーを避けるために使用することが多い。 添え字があるときの $D の値はややこしいので、ほとんど使うことはないが、 たとえば xyz(1)=1 なら $D(xyz) の値は 10 になる。 xyz(1,1)=1 なら $D(xyz) の値は 10 で $D(xyz(1)) の値は 11 。 |
|
$E $extract |
文字列の抽出。 たとえば str="abcdefg" なら $E(str,2,5) は str の2文字めから5文字めまでの意味なので その値は "bcd" である。 $E(str,3) なら str の3文字めで値は "c" |
|
$G $get |
変数の値を取り出す。 xyz=1 なら $G(xyz) の値は 1 $D と同じく、 undefinedのエラーを避けるために使用することが多い。 >変数xyzが未定義なら という次の if 文 if '$D(xyz) … は if $G(xyz)="" … と同じ意味になる。 s xyz=$G(xyz,"abc") は >xyz がもともと定義されていれば >xyz は xyz だが、 >もし未定義なら "abc" をセット |
|
$L $length |
文字列の長さ(文字数)を返す。 たとえば str="abcdefg" なら $L(str) の値は 7 となる。 ただし str="あいueo" とすると 全角を1文字とカウントするために $L(str) の値は 5 となる。 このことが不便なことがあるので エムウェブの関数 $$L^uTW(str) で代用すると 全角を2文字とカウントするので値は 7である。 |
|
$O $order |
添え字の順に変数が並んでいるとき、次の添え字を返す。 たとえば xyz(3)="" xyz(10)="" xyz(16)="" xyz(25)="" と 定義されているとして s n=3 s n=$O(xyz(n)) と書くと n の値は 3 の次の添え字の 10 である。 s n="" s n=$O(xyz(n)) とすると n の値は最初の添え字の 3 となり n が25(最後)の場合はヌル(空)に戻る。 for でループをまわして データを次々に処理するときに必須。 |
|
$P $piece |
指定の文字で区切られた部分の文字列を返す。 たとえば str="abcdefg" なら $P(str,"e",2) の値は >文字列を "e" で区切った2つめ の意味で値は "fg" となる。 str="a-b-c-d-e-f-g" のとき $P(str,-",3,5) の値は >文字列を "-" で区切った3つから5つめ なので 値は "c-d-e" である。 |
|
$R $random |
指定した範囲でランダムな整数値を返す。 $R(10) なら 0から9までの整数から、どれかわからないひとつの数字が返されるが、10が含まれないことに注意が必要。 |
|
$TR $translate |
指定する文字列で、元の文字列を置換して、新しい文字列を返す。 たとえば str="abcdefg" なら $TR(str,"cde","x") の値は "abxfg" となる。 |
🔰
定数や演算子
に
ついては
どの言語も似たり寄ったりなので
コードを書いたり読んだりしているうちに自然とわかるはずです。
マンプスに特徴的なものをいくつか例にとって説明しますので
コマンドプロンプトから1回でも実行してみたらOKです。
I "ABC"["B" W 10#3
は
>文字列 "ABC" が文字 "B" を含んでいたら
>10を3で割った余りを書け
なので
表示されるのは 1 です。
条件をあらわす IF は
W:"ABC"["B" 10#3
のように
コロンで簡易に代替することができ
古いルーチンではしょっちゅう使われてます。
I (10\3>5)!(A'=5) S B="K"
は
>10 を 3 で割った解の整数部分が 3 より大きいか
>または変数 A が 5 でなければ
>変数 B に文字 "K" をセットしろ
で、
A が定義されていなければエラーになるので
先に A になにかセットしてから実行してみましょう。
10\3 は 3 なので
はじめの条件はクリアしてません。
ということは
A に 5 をセットしなかったなら
B には "K" がセットされます。
以下
演算子のまとめの中では
「パターン照合」が少しややこしいですが
めったに使わないので
この段階では知らなくてもだいじょうぶです。
※
半角のバックスラッシュ「 \ 」
(整数除算=割り算した答の小数以下切り捨て)は
文字コードによって「¥」に見えることに注意が必要です。
| ' | 否定(でない) |
| + | 足し算 |
| - | 引き算 |
| * | 掛け算 |
| / | 割り算 |
| \ | 整数除算(「 \ 」も「 ¥ 」も同じ) |
| # | 余り |
| < | 小なり |
| > | 大なり |
| = | イコール |
| [ | 含む |
| ? | パターン照合 |
| _ | 連結 |
| & | かつ |
| ! | または |
| @ | 間接演算 |
ややこしいけど
知らなくてもよいというわけにはいかないのが
「間接演算」の「@」です。
たいへん便利で利用する場面も多いですが
ひねりが必要なのでたまに頭が「?」で混乱します。
たとえば
コマンドプロンプトから
XYZ>k
XYZ>s a="b"
XYZ>s @a=1
と入力して
XYZ>w
で変数の中味を確認すると
a="b"
b=1
となります。
XYZ>k
XYZ>s a="b"
XYZ>s @a@(1)=1
と入力して
XYZ>w
なら?
a="b"
b(1)=1
次に
XYZ>s a="try^t912"
と入力して
XYZ>D @a
とすると?
また、
まるで嫌がらせのようにしつこく
Hello, world!
が💦
これで
>そうかわかった!
と
ならなかった場合は
実務で出くわしたときに
そのつど理解するように努めるとよいです。