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
ファラデー定数 [C/mol] 96485.33212331
万有引力定数 [N・m^2/kg^2] 6.67430e-011
Na アボガドロ定数 [1/mol] 6.02214076e+023
真空中の光速度 [m/s] 299792458
電気素量 [C] 1.602176634e-019
重力加速度 [m/s^2] 9.80665
プランク定数 [J・s] 6.62607015e-034
ボルツマン定数 [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 キーを押すと詳細な説明を表示することができます。