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 パック変数
パック変数の接頭辞は「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 行列
行列の変数に代入するには、各要素に代入するか、行に分解して ::vector 関数を用います。
m.a[0] = ::vector[1, 2, 3];! m.a[1] = ::vector[4, 5, 6];! m.a[2] = ::vector[7, 8, 9];!
また、単位行列には ::i_matrix 関数を用います。
m.a = ::i_matrix 3 > 0 1 2 > 0 [ 1 ][ 0 ][ 0 ] > 1 [ 0 ][ 1 ][ 0 ] > 2 [ 0 ][ 0 ][ 1 ] >
0 で初期化する場合は ::repeat 関数を用います。 必要ではありませんが、::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 テーブル
テーブルの変数に代入するには、各要素に代入するか、列に分解して ::vector 関数もしくは ::array 関数を用います。
t.a[0] = ::vector[1, 2, 3];! t.a[1] = ::array["a", "b", "c"];!
推奨する使用方法は、列の項目を設定したのち、行を追加していく方法です。
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[x][y] の表記を用います。
4-8 ファンクション
ファンクションの変数に代入するには、あらかじめ定義したユーザ関数を 'F.' で指定します。
f.a = F.user_function_name;
ファンクション変数には、データウィンドウの読出し、書込みはありません。
4-9 パック
パックの変数に代入するには、各要素を '[ ]' で囲みます。
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 キーを押すと詳細な説明を表示することができます。