1-0 概要
スクリプトは行単位で解析を行います。 行は「計算式」か「コマンド」か、もしくはブロック区切り文字('{', '}', '[', ']')、 空白行を識別します。 一行で記述しきれない場合には '\' 記号で継続することができます。
「計算式」と「コマンド」は、解析後にコンパイルと簡単な最適化を行い実行します。 そのため、ループ処理など時間のかかる処理を高速に実行することが可能です。
1-1 計算式
一般的な数式はもちろん、固有の関数を用いて計算を実行します。
4*3^2 > 36 sin 0.5π > 1 v.a = ::vector[1,2,3]; v.b = ::vector[4,5,6]; 2*v.a + v.b > 0 [ 6] > 1 [ 9] > 2 [ 12] >
演算には優先順位と結合方向があります。 詳細は PrimMath のヘルプを参照ください。
1-2 コマンド
様々な処理を実行するのがコマンドです。 コマンドは ':' で始まります。
:sub test
{
:print STD, "Hello, world!";
}
> OK
:test
> Hello, world!
:if, :for, :while, :return などの制御文もコマンドです。
2-0 概要
変数の宣言は不要で、決まった値の初期値で使い始めることができます。 変数は型によって接頭辞の規則があります。 見た目で型が分かるので可読性に優れています。 識別子には、英数字、アンダースコア、漢字、ひらがな、カタカナ、が使用できます。
変数は、等号記号による代入、ユーザ関数の引数、ユーザコマンドの引数、はすべて値渡しです。 コマンドの引数で '\' 記号のついた変数のみが参照渡しになります。
例外として、テンソル、ファンクションとパックは ユーザ関数の引数、ユーザコマンドの引数は参照渡しになります。
2-1 数値変数
数値変数には接頭辞がありません。 そのため、識別子を数字から始めることはできません。 また、「Ans」と数学関数以外の名前でなければいけません。 このような制約がありますが、PrimMath のスクリプトエディタでは 文字の色が変わるので間違えることはないと思います。
数値変数は、スカラの複素数を格納します。初期値は 0 です。
特徴
- 最も多用する変数型。
2-2 ベクトル変数
ベクトル変数の接頭辞は「v.」です。 識別子には「v.0」「v.Ans」以外の任意の名前が付けられます。
ベクトル変数は、1次元配列の任意のサイズの複素数を格納します。 初期値はサイズが 0 のベクトルです。
要素への参照は「v.name[i]」です。 サイズ以上の i を指定するとサイズが拡張され、読出しでは 0 を返します。 また、i には負の値を指定することもでき、その場合は末尾からカウントした要素になります。 負の値では、サイズを超えるとエラーになり、読出しでは NaN を返します。
特徴
- 内積、クロス積などのベクトル計算。
- 平均、標準偏差、歪度、尖度などの統計計算。
- フーリエ変換などの数値計算。
2-3 行列変数
行列変数の接頭辞は「m.」です。 識別子には「m.0」「m.Ans」以外の任意の名前が付けられます。
行列変数は、2 次元配列の任意のサイズの複素数を格納します。 初期値は行と列ともサイズが 0 の行列です。
要素への参照は「m.name[i][j]」です。 サイズ以上の i, j を指定するとサイズが拡張され、読出しでは 0 を返します。
「m.name[i]」で行のベクトルを、「m.name[][j]」で列のベクトルを参照することができます。
特徴
- 行列積、逆行列、固有値、特異値分解などの行列計算。
2-4 テンソル変数
テンソル変数の接頭辞は「z.」です。 識別子には「z.0」「z.Ans」以外の任意の名前が付けられます。
テンソル変数は、多次元配列の任意のサイズの複素数を格納します。 初期値は階数が 0 のテンソルです。 固有の仕様として、階数 0 のテンソルは数値を格納することができません。 :=create 関数で形状を指定してから使い始めます。 サイズの自動拡張はありません。
ユーザ関数、ユーザコマンドには、参照渡しされます。
:=create_real 関数を使うことで、実数専用のテンソルを作ることができます。 実数専用のテンソルは全般に処理が高速になります。
特徴
- 形状変更、軸の入替などのテンソル固有処理。
2-5 文字列変数
文字列変数の接頭辞は「$」です。 識別子には「$Ans」以外の任意の名前が付けられます。
文字列変数は、スカラの文字列を格納します。 初期値は「""」(空文字列)です。
特徴
- 正規表現も使用可能。
2-6 文字列配列変数
文字列配列変数の接頭辞は「$v.」です。 識別子には「$v.0」「$v.Ans」以外の任意の名前が付けられます。
文字列配列変数は、1次元配列の任意のサイズの文字列を格納します。 初期値はサイズが 0 の文字列配列です。
要素への参照は「$v.name[i]」です。 サイズ以上の i を指定するとサイズが拡張され、読出しでは「""」(空文字列)を返します。 また、i には負の値を指定することもでき、その場合は末尾からカウントした要素になります。 負の値では、サイズを超えるとエラーになり、読出しでは「""」(空文字列)を返します。
特徴
- 豊富な配列処理。
2-7 テーブル変数
テーブル変数の接頭辞は「t.」です。 識別子には「t.0」「t.Ans」以外の任意の名前が付けられます。
テーブル変数の初期値は列数、行数とも 0 のテーブルです。 列には数値のベクトルもしくは文字列の配列を持ちます。 行、列ともに「タグ」を付けることができ、「タグ」で参照することもできます。 タグに直値を使用する場合は { } を使うことができます。
t.a{}[$key] とすれば、テーブル変数を1次元ハッシュテーブルとして使用できます。
特徴
- 表データを扱うのに好適。
2-8 ファンクション変数
ファンクション変数の接頭辞は「f.」です。 識別子には「f.0」「f.Ans」以外の任意の名前が付けられます。
ファンクション変数には、ユーザ関数を格納することができます。 また、数式を指定して格納することもできます。 ファンクション変数の初期値は未定義になります。
定義されたユーザ関数、もしくは数式を、生成演算子 'F.' で、ファンクション変数に代入することができます。 また、実行演算子 '::' で、ファンクション変数を実行することができます。
:func function_test, ファンクションのテスト, x, y, z
{
:return x^y + z;
}
> OK
f.a = F.function_test;
f.a
> ::function_test
> ファンクションのテスト
> num ::function_test[x, y, z]
>
::f.a[2, 3, 4]
> 12
特徴
- 数式指定では数式処理が可能。
2-9 選択肢変数
選択肢変数の接頭辞は「o.」です。 識別子には「o.0」「o.Ans」以外の任意の名前が付けられます。
選択肢を使うには、まず :enum コマンドで選択肢定数を設定します。 そして、:match コマンドで処理を選択します。
:enum TOP, BOTTOM, MIDDLE;
o.a = TOP;
:match o.a
[
TOP | BOTTOM
{
"上下"
}
default
{
"その他"
}
]
> "上下"
特徴
- :if、:elseif、:else で構成するより処理が高速。
2-10 パック変数
パック変数の接頭辞は「p.」です。 識別子には「p.0」「p.Ans」以外の任意の名前が付けられます。
'[ ]' で囲むことであらゆる変数をパックにすることができます。 パック変数の初期値は要素が空です。配列のように 'p.a[index]' で参照できます。 また、「タグ」を付けることができ、「タグ」で参照することもできます。 タグに直値を使用する場合は { } を使うことができます。
p.a = [::vector[1,2,3], ::array["a", "b", "c"]];
p.a:=append_key[::array["vector", "array"]];
p.a[0]
> 0 [ 1]
> 1 [ 2]
> 2 [ 3]
>
p.a{array}
> 0 ["a"]
> 1 ["b"]
> 2 ["c"]
>
特徴
- 構造体のような使い方が可能。
3-0 概要
組み込みの定数には、数学定数、物理定数、単位定数、文字列定数、初期化定数があります。
ver.31 以降では、物理定数の変更が可能です。 "C:/Program Files/PrimMath" にある ".init.pml" を「マイドキュメント」の "PrimMath" フォルダにコピーして書き換えると使用できます。 定数の追加も可能です。
3-1 数学定数
数学定数には次のものがあります。
| 識別子 | 意味 | 値 |
|---|---|---|
| π | 円周率 | 3.14159265358979 |
| ι | 虚数単位 | i |
| ∞ | 無限大 | ∞ |
3-2 物理定数
物理定数には次のものがあります。
| 識別子 | 意味 | 値 |
|---|---|---|
| ε0 | 真空の誘電率 [F/m] | 8.8541878128e-012 |
| μ0 | 真空の透磁率 [N/A^2] | 1.25663706212e-006 |
| F | ファラデー定数 [C/mol] | 96485.33212331 |
| G | 万有引力定数 [N・m^2/kg^2] | 6.67430e-011 |
| Na | アボガドロ定数 [1/mol] | 6.02214076e+023 |
| c | 真空中の光速度 [m/s] | 299792458 |
| e | 電気素量 [C] | 1.602176634e-019 |
| g | 重力加速度 [m/s^2] | 9.80665 |
| h | プランク定数 [J・s] | 6.62607015e-034 |
| k | ボルツマン定数 [J/K] | 1.380649e-023 |
3-3 単位定数
単位定数には次のものがあります。
| 識別子 | 意味 | 値 |
|---|---|---|
| ° | 角度の変換係数 (2π/360) | 0.0174532925199433 |
3-4 文字列定数
文字列定数には次のものがあります。
| 識別子 | 意味 | 値 |
|---|---|---|
| $HT | タブ(\t) | |
| $LF | 改行(\n) | |
| $MYPATH | マイドキュメントのパス名 | |
| $PATH | PrimMath のパス名 | |
| $VER | PrimMath のヴァージョン |
3-5 初期化定数
初期化定数には次のものがあります。
| 識別子 | 意味 | 値 |
|---|---|---|
| v.0 | ベクトルの初期値 | |
| m.0 | 行列の初期値 | |
| z.0 | テンソルの初期値 | |
| $v.0 | 文字列配列の初期値 | |
| t.0 | テーブルの初期値 | |
| f.0 | ファンクションの初期値 | |
| p.0 | パックの初期値 |
4-0 概要
数値と文字列に直値があります。 ベクトルと文字列配列には関数で代入します。 行列とテーブルは行と列に分解して代入します。
4-1 数値
10 進の数値と、'0x'から始まる 16 進の整数、および'0b'から始まる 2 進の整数を直値とすることができます。 '_'を任意に数値の間に挿入することができます。
例:
123.456 ⇒ 実数
1.2+3.4ι ⇒ 複素数
100_000 ⇒ 科学技術計算向け 3 桁区切(100k)
10_0000 ⇒ 日本の単位向け 4 桁区切(10 万)
0xABCD ⇒ 16 進数
0xAB_CD ⇒ バイト区切 16 進数
データウィンドウの値を用いるには D[x][y] の表記を用います。
4-2 文字列
ダブルクォーテションで囲んだリテラル文字列を直値とすることができます。 文字列の中に'"'を含めるためには'\'によりエスケープします。
例:
"abcd"
"文字列\"abc\""
データウィンドウの値を用いるには $D[x][y] の表記を用います。
4-3 ベクトル
::vector関数を用います。
例:
::vector[1, 2, 3]
データウィンドウの値を用いるには V[x][y](縦)、H[x][y](横)の表記を用います。
4-4 文字列配列
::array関数を用います。
例:
::array["a", "b", "c"]
データウィンドウの値を用いるには $V[x][y](縦)、$H[x][y](横)の表記を用います。
4-5 行列
::matrix関数を使用します。
::matrix[[[1,2,3], [4,5,6]]] > 0 1 2 > 0 [ 1][ 2][ 3] > 1 [ 4][ 5][ 6] >
単位行列には ::i_matrix 関数を用います。
m.a = ::i_matrix 3 > 0 1 2 > 0 [ 1 ][ 0 ][ 0 ] > 1 [ 0 ][ 1 ][ 0 ] > 2 [ 0 ][ 0 ][ 1 ] >
0 で初期化する場合は ::repeat 関数を用います。
m.a = ::repeat[0, 3, 4] > 0 1 2 3 > 0 [ 0 ][ 0 ][ 0 ][ 0 ] > 1 [ 0 ][ 0 ][ 0 ][ 0 ] > 2 [ 0 ][ 0 ][ 0 ][ 0 ] >
乱数で初期化する場合は :setVarRand コマンドと ::rand 関数を用います。
randVar = 0; :setVarRand randVar, UNI, -1, 1; m.a = ::rand[randVar, 3, 4] ! randVar=1; > 0 1 2 3 > 0 [ -0.9501 ][ 0.4103 ][ -0.2524 ][ -0.3885 ] > 1 [ 0.25 ][ -0.9271 ][ -0.3944 ][ 0.5912 ] > 2 [ -0.1748 ][ -0.1354 ][ 0.1202 ][ -0.5948 ] >
データウィンドウの値を用いるには M[x][y] の表記を用います。
4-6 テンソル
テンソルに値を代入するには、:=build 関数を用います。
z.a:=create[2,3]; z.a:=build[::vector[1,2,3,4,5,6]] > [ 1, 2, 3] > [ 4, 5, 6] >
同じ値で初期化する場合は :=setall 関数を用います。
z.a:=setall[1] > [ 1, 1, 1] > [ 1, 1, 1] >
データウィンドウの値を用いるには Z[x][y] の表記を用います。
4-7 テーブル
::table関数を使用します。
::table[[[1,2,"abc"], [4,5,"def"]]] > 0 1 2 > > 0 [ 1][ 2]["abc"] > 1 [ 4][ 5]["def"] >
推奨する使用方法は、列の項目を設定したのち、行を追加していく方法です。
t.a = t.0;
t.a:=add_col[::array["名前", "年齢"]];
t.a:=append_line[1];
t.a{名前}[0] = "山田";
t.a{年齢}[0] = 23;
t.a
> 0 1
> 名前 年齢
> 0 ["山田"][ 23 ]
>
もしくは
t.a = t.0; t.a:=add_col[::array["名前", "年齢"]]; t.a:=append[::line_tbl["山田", 23]]; t.a > 0 1 > 名前 年齢 > 0 ["山田"][ 23 ] >
データウィンドウの値を用いるには T[x][y] の表記を用います。
4-8 ファンクション
ファンクションの変数に代入するには、あらかじめ定義したユーザ関数を 'F.' で指定します。
f.a = F.user_function_name;
あるいは、引数と数式を 'F.' で指定します。
f.a = F.[x, y]{x^2 + 3y};
ファンクション変数には、データウィンドウの読出し、書込みはありません。
4-9 選択肢
選択肢の定数を設定するには、:enum コマンドを使用します。
:enum LEFT, CENTER, RIGHT;
選択肢変数には、データウィンドウの読出し、書込みはありません。
4-10 パック
パックの変数に代入するには、各要素を '[ ]' で囲みます。
p.a = [1, 2, 3]
パック変数には、データウィンドウの読出し、書込みはありません。
5-0 概要
演算子と関数は式の中で使用します。 いくつかの演算子と関数は項の型によって多重定義(オーバーロード)されています。 全てのシステム関数は引数の値を変更することはありません。
5-1 演算子
演算子には、単項演算子と二項演算子があります。三項以上の演算子はありません。詳しくは PrimMath のヘルプを参照ください。
多重定義されている代表的な演算子は次のものです。
| 演算子 | 項の型 | 意味 | 結果 |
|---|---|---|---|
| + | 数値+数値 | 数値の加算 | 数値 |
| 文字列+文字列 | 文字列の連結 | 文字列 | |
| ベクトル+ベクトル | ベクトルの加算 | ベクトル | |
| ベクトル+数値 | ベクトル各要素と数値の加算 | ベクトル | |
| 数値+ベクトル | |||
| 文字列配列+文字列配列 | 文字列配列要素毎の連結 | 文字列配列 | |
| 文字列配列+文字列 | ベクトル各要素と文字列の連結 | 文字列配列 | |
| 文字列+文字列配列 | |||
| 行列+行列 | 行列の加算 | 行列 | |
| 行列+数値 | 行列各要素と数値の加算 | 行列 | |
| 数値+行列 | |||
| - | 数値-数値 | 数値の減算 | 数値 |
| ベクトル-ベクトル | ベクトルの減算 | ベクトル | |
| ベクトル-数値 | ベクトル各要素と数値の減算 | ベクトル | |
| 数値-ベクトル | |||
| 行列-行列 | 行列の減算 | 行列 | |
| 行列-数値 | 行列各要素と数値の減算 | 行列 | |
| 数値-行列 | |||
| * | 数値*数値 | 数値の乗算 | 数値 |
| 文字列*数値 | 文字列の繰返し | 文字列 | |
| ベクトル*ベクトル | ベクトルの内積 | 数値 | |
| ベクトル*数値 | ベクトル各要素と数値の乗算 | ベクトル | |
| 数値*ベクトル | |||
| 文字列配列*数値 | 文字列配列各要素の繰返し | 文字列配列 | |
| 行列*行列 | 行列の乗算 | 行列 | |
| 行列*ベクトル | 行列とベクトルの乗算 | ベクトル | |
| 行列*数値 | 行列と数値の乗算 | 行列 | |
| 数値*行列 | |||
| / | 数値/数値 | 数値の除算 | 数値 |
| ベクトル/数値 | ベクトル各要素と数値の除算 | ベクトル | |
| 数値/ベクトル | |||
| <*> | ベクトル<*>ベクトル | ベクトル各要素の乗算 | ベクトル |
| 行列<*>行列 | 行列各要素の乗算 | 行列 | |
| </> | ベクトル</>ベクトル | ベクトル各要素の除算 | ベクトル |
| 行列</>行列 | 行列各要素の除算 | 行列 | |
| == | 数値==数値 | 数値の等価 | ブール値 |
| 文字列==文字列 | 文字列の等価 | ||
| ベクトル==ベクトル | ベクトルの等価 | ||
| 行列==行列 | 行列の等価 | ||
| 文字列配列==文字列配列 | 文字列配列の等価 | ||
| != | 数値!=数値 | 数値の不等価 | ブール値 |
| 文字列!=文字列 | 文字列の不等価 | ||
| ベクトル!=ベクトル | ベクトルの不等価 | ||
| 行列!=行列 | 行列の不等価 | ||
| 文字列配列!=文字列配列 | 文字列配列の不等価 | ||
| 比較 演算子 | 数値<数値 | 数値の比較 | ブール値 |
| 文字列<文字列 | 文字列の比較 |
対応する代入演算子も多重定義です。
5-2 関数
関数には、数学関数、特殊関数、統計関数、汎用関数、代入関数があります。詳しくは PrimMath のヘルプを参照ください。
引数が複数ある場合には [ ] で囲みます。
例:
::erase["abcdefg", 2, 3]
6-0 概要
制御構文はコマンドとして実行します。 C言語や Perl、Python と似た構文を持ちます。
6-1 条件分
条件分は、:if コマンドを使用します。 必要に応じて、:elseif コマンド、:else コマンドを追加することができます。
書式
:if 条件1
{
文1
}
:elseif 条件2
{
文2
}
:else
{
文3
}
6-2 ループ文
ループ文には、:while コマンド、:for コマンド、:foreach コマンド、:foreacharray コマンドがあります。
:while コマンドは与えられた条件が真の間、ループを実行します。
書式
:while 条件
{
文
}
:for コマンドは開始値と終了値を与えてループを実行します。
書式
:for 変数名, 開始値, 終了値, 変化値, オプション
{
文
}
:foreach コマンドはベクトルもしくは文字列配列の要素毎にループを実行します。
書式
:foreach 変数名, 値のリストもしくはベクトルあるいは文字列配列
{
文
}
:foreacharray コマンドは複数のベクトルもしくは文字列配列の要素毎にループを実行します。
書式
:foreacharray 変数名1,ベクトル1あるいは文字列配列1, …
{
文
}
ループ文の中では、:break コマンド、:continue コマンド、:last-:endコマンドを実行できます。
:break コマンドはループから抜け出します。
:continue コマンドは条件を更新してループの先頭に戻ります。
:last コマンドは :end コマンドで定義された文を実行したあと条件を更新してループの先頭に戻ります。:last コマンドはループから抜けるわけではありません。
7-0 概要
サブルーチンには、ユーザ関数とユーザコマンドがあります。 サブルーチンの中では、:local コマンド、:return コマンドを実行できます。
:local コマンドはサブルーチンの中でのみ使用するローカル変数を設定します。 引数の変数は宣言なしにローカル変数になります。
:return コマンドは値を返してサブルーチンを終了します。
7-1 ユーザ関数
ユーザ関数は、:func コマンドにより定義します。
書式
:func 関数名, 説明文, 引数名, …
{
文
}
ユーザ関数は式の中で使用することができます。そのため、必ず値を返さなければいけません。 引数の値を変更することはできません。
例外として、テンソル、ファンクションとパックの引数は参照渡しになるため、値を変更することができます。
7-2 ユーザコマンド
ユーザコマンドは、:subコマンドにより定義します。
書式
:sub コマンド名, 説明文, 引数名, …
{
文
}
ユーザコマンドは式の中で使用することはできません。参照渡しができるため、引数の値を変更することができます。複数の変数の値を変更する場合に有効です。
8-1 コメント
行単位で、'#'以降がコメントになります。 複数行をまとめてコメントにする方法はありませんが、 PrimMath のスクリプトエディタでは矩形選択、複数行挿入の機能がありますので、 複数行の先頭に'#'を付ける、あるいは削除するということは容易です。
8-2 ヘルプ
メニューからのヘルプ表示に加えて、F1 キーによる状況依存ヘルプが使用できます。 特に、コマンドや関数にカーソルがあるときに F1 キーを押すと詳細な説明を表示することができます。