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";
double bb = 1.234; // 宣言と代入 double cc; // 宣言 cc = 9.876; // 代入 int nn; //定数を定義する際には必ず代入する必要があります //定数は変更することができません const c1 = 0.5;
//次のスクリプトを使って文字列を定義 string greeting$ = "Hello World"; %A = greeting$; //次のスクリプトで文字列の値を取得 greeting$ =; %A =;
//”+”は文字列の結合を行う演算子です %B = "greeting" + "$"; //文字列レジスタ%Bの値を返します //greeting$というテキストが返されます %B =;
//通常、%と任意の文字は26個の文字列レジスタのうちの1つとして解釈されます。 //接頭辞として%をつけることで置換をさせないようにできます string str1$ = %%B; //文字列変数str1の値を返します //%Bが返ってきます str1$ =;
//1から10まで0.5ずつ増加する数列としてこのデータセットを定義 dataset aa = {1:0.5:10};
//代入 temp = {10,9,8,7,6}; //createコマンド //”tmpdata”というルースデータセットを作成し行数を5で定義 create tmpdata -wdn 5 X Y;
Note:コマンド文は、一意である限り、コマンド自体またはその省略形から始まります(この例では、"create "がコマンドです)。ほとんどのコマンドにはオプションがあり、”-”記号が接頭辞になります。(この例では、”-wdn”がオプションもしくはスイッチです)コマンド自身とそのオプションの両方が引数を取ることができます(この例では、”tmpdata”がコマンドの引数、”5 X Y”が-wdnオプションの引数です)。
tmpdata_X[1] = 1; tmpdata_X[2] = 2; tmpdata_X[3] = 2.5;
tmpdata_Y = temp;
|
プロジェクトレベルのデータセット(例:tmpdata_X、tmpdata_Y)はプロット用に使用できますが、セッションレベルのデータセット(例:aa)はプロットには使用できません。 プロットするためには次のスクリプトを使用します。 plotxy iy:=tmpdata_Y plot:=202; |
StringArray stra; stra.Add("Hello"); stra.Add("World");
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}
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); }
//dataset.GetSize() メソッドを使用するには、 //最初にデータセット オブジェクト ld を宣言する必要があります dataset ld = loopdata; for(jj = 1; jj <= ld.GetSize(); jj = jj + 10) { ld[$(jj)] =; }
doc -eループは、特定のタイプのオブジェクトに影響を与えるスクリプトが実行されているときに使用されます。オブジェクトタイプについては、documentコマンドを参照してください。
構文: doc -e object {script}
doc -e S { %C =; }
分岐構造
分岐構造により、プログラムは状況に応じて異なる一連のアクションを実行できます。LabTalkでは、if、if-else、switchの3つの判断分岐構造を提供します。
ifコマンドは、指定した条件が成り立った場合、つまり、真(true)の場合に、指定したスクリプトを実行する場合に使用します。elseコマンドと組み合わせると、特定の式が偽(false)の場合、別のスクリプトが実行されます。
構文: if (testCondition) {script1} [else {script2}]
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 は、次の構文で呼び出される組み込み関数を介して多くの操作をサポートします。
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$)); }
//ユリウス通日を計算してdouble型の変数jdaに渡す double jda = JDate(0.83); //jdaの数値を出力 jda =;//2455373 //日付をMM/DD/YYYYの表記で表示 type $(jda, D0);//6/26/2010
Note: 以下のスクリプトを実行し、Xファンクションcsetvalueで第一列に乱数を取得します。
newbook; wks.nCols = 2; csetvalue col:=1 formula:="grnd()";
col(B) = JDate(col(A));
wks.col2.format = 4;