LabTalkの基本
Tutorial-Language-Fundamental
概要
LabTalkは様々なデータタイプの変数をサポートしています。異なるステートメントでのこれら変数の利用はスクリプトにおける基本的な考え方です。型宣言なしで使われる変数はデフォルトでdoubleもしくはstring型になり、プロジェクトスコープになります。(Originプロジェクトが開いてる限り存在し、プロジェクトに保存できます)
C言語のようにLabTalkのステートメントはセミコロン(”;”)で終わります。実行するコードのブロックを定義するフロー制御文があり、ブロックは中括弧('{'と'}')で区切られます。
ブロックで定義した変数はスコープを持ち、ブロックを離れるときに変数は消去されます。
学習する項目
このチュートリアルでは、以下の項目について解説します。
- 様々なデータ型の変数の定義と利用
- プログラム関数を制御するコマンドステートメントの記述
- 条件とループ構文の作成
- 操作で組み込み/ユーザ定義関数を利用
基本構文
LabTalkは次の9個のデータ型をサポートしています。double, integer, constant, dataset, string, stringarray, range, tree, graphic objectsLabTalkスクリプトは変数の定義(または宣言)とそれらの操作に基づいています。
LabTalkでは5種のステートメントが利用されます。代入文、マクロ文、コマンド文、算術文、関数文です。
基本のプログラミング構文の例をこの章のチュートリアルで紹介します。
- プロジェクト変数になるように、宣言なしで変数を定義
-
// double型のプロジェクト変数として定義
aa = 3.5;
// string型のプロジェクト変数として定義
str$ = "Hello";
- セッション変数として、数値変数bb(double)、nn(integer)、c1(constant)を定義
-
double bb = 1.234; // 宣言と代入
double cc; // 宣言
cc = 9.876; // 代入
int nn;
//定数を定義する際には必ず代入する必要があります
//定数は変更することができません
const c1 = 0.5;
- string変数を宣言しさらにstringレジスタに保存
-
//次のスクリプトを使って文字列を定義
string greeting$ = "Hello World";
%A = greeting$;
//次のスクリプトで文字列の値を取得
greeting$ =;
%A =;
- 文字列変数として認識させずに、"greeting$"というテキストを別の文字列として定義
-
//”+”は文字列の結合を行う演算子です
%B = "greeting" + "$";
//文字列レジスタ%Bの値を返します
//greeting$というテキストが返されます
%B =;
- 文字列レジスタとして認識させずに、”%B”というテキストを文字列変数として定義
-
//通常、%と任意の文字は26個の文字列レジスタのうちの1つとして解釈されます。
//接頭辞として%をつけることで置換をさせないようにできます
string str1$ = %%B;
//文字列変数str1の値を返します
//%Bが返ってきます
str1$ =;
- データセットを一時的なルースデータセットとして宣言します。このデータセットはワークシートに関連付けられず、Origin プロジェクトに保存されませんが、計算には使用できます。プロットには使用できません。
-
//1から10まで0.5ずつ増加する数列としてこのデータセットを定義
dataset aa = {1:0.5:10};
- プロジェクトレベルのルースデータセットを代入で作成、またはcreateコマンドで作成
-
//代入
temp = {10,9,8,7,6};
//createコマンド
//”tmpdata”というルースデータセットを作成し行数を5で定義
create tmpdata -wdn 5 X Y;
Note:コマンド文は、一意である限り、コマンド自体またはその省略形から始まります(この例では、"create "がコマンドです)。ほとんどのコマンドにはオプションがあり、”-”記号が接頭辞になります。(この例では、”-wdn”がオプションもしくはスイッチです)コマンド自身とそのオプションの両方が引数を取ることができます(この例では、”tmpdata”がコマンドの引数、”5 X Y”が-wdnオプションの引数です)。
- createコマンドで作成されるデータセット変数は、tmpdata_Xとtmpdata_Yの2つです。tmpdata_X に数値を1つずつ渡します。
-
tmpdata_X[1] = 1;
tmpdata_X[2] = 2;
tmpdata_X[3] = 2.5;
- 既存のデータセットから tmpdata_Y に値を渡します。
-
tmpdata_Y = temp;
|
プロジェクトレベルのデータセット(例:tmpdata_X、tmpdata_Y)はプロット用に使用できますが、セッションレベルのデータセット(例:aa)はプロットには使用できません。
プロットするためには次のスクリプトを使用します。
plotxy iy:=tmpdata_Y plot:=202;
|
- 文字列配列を定義し、それに文字列メンバーを追加します。
-
StringArray stra;
stra.Add("Hello");
stra.Add("World");
- 次のスクリプト (ループ構造については下のセクションで紹介) を使用して、文字列配列stra内の文字列を出力します。
-
loop(ii,1,stra.GetSize())
{
string str$=stra.GetAt(ii)$;
str$=;
//以下を返す
//Hello
//World
}
|
"list" および "del" コマンドで変数の表示と削除が可能です。以下のスクリプトを実行してアクセスできるLabTalk変数ビューアもあります。
list;
|
条件とループ構文
ループ
ループにより、プログラムで一連のアクションを繰り返し実行できます。LabTalk には、repeat、loop、doc -e、for の4つのループコマンドがあります。
repeatループは一連の操作が変更無く繰り返されるときに使われます。
構文: repeat value {script}
- 次のスクリプトを実行して、スクリプトウィンドウに行を6回出力し、繰り返しの回数を記録します。
int count = 1;
repeat 6 {type "this is output line $(count)"; count = count + 1;}
Loopループは、一連のループごとに1つの変数が1ずつ増えるときに使用されます。
構文: loop (variable, startVal, endVal) {script}
- 次のループを実行して、新しく作成されたデータセットに値を割り当てます。
//ワークシートに関連付けられていないデータセット (50行) を作成
create loopdata -t 50;
//ループを使用して値をデータセットに渡す
loop(ii, 1, 50)
{
loopdata[$(ii)] = ii^2;
}
forループは最も一般的なループで、他のすべての条件で使用できます。
構文:for (expression1; expression2; expression3) {script}
この構文では、expression1 は初期設定を指定し、expression2 はscriptを実行するか(trueの場合)、またはループを終了するか (falseの場合) を決定するために評価され、expression3 は多くの場合でカウンターの増分として各ループの最後に実行されます。expression1 および expression3 は次のようにコンマ区切りの複数のステートメントで構成できます。
for(ii = 1, jj = 9; ii <= 5 ; ii++, jj++)
{
ty $(ii), $(jj), $(ii+jj);
}
- 次のループを実行すると、作成したルースデータセットloopdataの10番目ごとの値を出力します。
//dataset.GetSize() メソッドを使用するには、
//最初にデータセット オブジェクト ld を宣言する必要があります
dataset ld = loopdata;
for(jj = 1; jj <= ld.GetSize(); jj = jj + 10)
{
ld[$(jj)] =;
}
doc -eループは、特定のタイプのオブジェクトに影響を与えるスクリプトが実行されているときに使用されます。オブジェクトタイプについては、documentコマンドを参照してください。
構文: doc -e object {script}
- 次のループを実行して、Originプロジェクトの各データセットの名前を出力します (ワークシートの列とプロジェクトレベルのルースデータセットを含む)。
doc -e S
{
%C =;
}
分岐構造
分岐構造により、プログラムは状況に応じて異なる一連のアクションを実行できます。LabTalkでは、if、if-else、switchの3つの判断分岐構造を提供します。
ifコマンドは、指定した条件が成り立った場合、つまり、真(true)の場合に、指定したスクリプトを実行する場合に使用します。elseコマンドと組み合わせると、特定の式が偽(false)の場合、別のスクリプトが実行されます。
構文: if (testCondition) {script1} [else {script2}]
- Originプロジェクトファイルで、ワークブックが1つ、グラフウィンドウが1つ、行列ウィンドウが1つ、レイアウトページが1つあるとします。各ウィンドウをアクティブにし、次のスクリプトを実行して、ウィンドウの種類を決定します。
if(exist(%H)==3)
type -b "A graph window is active";
else
if(exist(%H)==2)
type -b "A worksheet is active";
else
type -b "Neither a graph nor worksheet is active";
switchコマンドは、2つ又はそれ以上の条件があって、条件を満たしたときの指定スクリプトを実行をする場合に使用します。
例えば、上述のif-else構造のスクリプトは以下のように修正できます。
switch(exist(%H))
{
case 3:
type -b "A graph window is active";
break;
case 2:
type -b "A worksheet is active";
break;
case 5:
type -b "A Matrix is active";
break;
default:
type -b "Neither a graph, worksheet nor matrix is active";
break;
}
LabTalk関数
LabTalk は、次の構文で呼び出される組み込み関数を介して多くの操作をサポートします。
outputVariable = FunctionName(Arg1 Arg2 ...ArgN);
また、次の構文でユーザ定義関数を作成できます。
function dataType funcName(Arg1 Arg2 ...ArgN) {script;}
関数では、引数と戻り値の両方がstring、double、int、dataset、treeデータ型をサポートしています。
- まず、組み込み関数を呼び出して、ユーザ定義の数値関数を宣言します。この関数は、ランダムな数値からユリウス日の値を生成します。
-
function double JDate(double num)
{
//doubleから積分を計算
int x = int(exp(num)*1000);
//剰余関数mod()で日、月、年の積分を生成
int iDay = mod(x, 27) + 1;
int iMonth = mod(x, 11) + 1;
int iYear = 2013 - mod(x, 5);
//MM/DD/YYYYとして文字列を定義
string jd$ = $(iMonth)/$(iDay)/$(iYear);
//関数の結果として文字列からユリウス通日を返す
//%()表記で文字列を置換
return date(%(jd$));
}
- ユーザ定義関数JDateを呼び出し、0.83などの数値からユリウス通日を計算します。
-
//ユリウス通日を計算してdouble型の変数jdaに渡す
double jda = JDate(0.83);
//jdaの数値を出力
jda =;//2455373
//日付をMM/DD/YYYYの表記で表示
type $(jda, D0);//6/26/2010
- 2列あるワークブックを作成して、一行目のA列で右クリックし、列値の一律設定:一様乱数を選択して乱数値を列に入力します。
-
Note: 以下のスクリプトを実行し、Xファンクションcsetvalueで第一列に乱数を取得します。
newbook;
wks.nCols = 2;
csetvalue col:=1 formula:="grnd()";
- JDate関数を使ってB列にユリウス通日を算出します。
-
col(B) = JDate(col(A));
- 列フォーマットを日付に変更します。
-
wks.col2.format = 4;
|