目次
- 1 使い方
- 1.1 変数宣言の強制(EXPLICIT)
- 1.2 大文字・小文字を区別(SAMESTR)
- 1.3 PUBLICの重複定義の禁止(OPTPUBLIC)
- 1.4 FINALLY部を実行(OPTFINALLY)
- 1.5 特殊文字の変換をしない(SPECIALCHAR)
- 1.6 短絡評価をする(SHORTCIRCUIT)
- 1.7 停止ホットキーを無効(NOSTOPHOTKEY)
- 1.8 STOPボタンウィンドウを最前面固定(TOPSTOPFORM)
- 1.9 吹き出しを仮想デスクトップの全画面(FIXBALLOON)
- 1.10 フォント, サイズを変更(DEFAULTFONT)
- 1.11 位置を変更(POSITION)
- 1.12 ログファイルのパスを変更(LOGPATH)
- 1.13 ログの最大行数を変更(LOGLINES)
- 1.14 ログ出力モード(LOGFILE)
- 1.15 ダイアログのタイトル変更(DLGTITLE)
- 2 短絡評価
スクリプトファイル毎にオプションを指定します。
- 構文
- OPTION 項目
- EXPLICIT
- 変数宣言の強制(すべての変数でDIM、もしくはPUBLIC宣言が必要)
- SAMESTR
- 文字比較、置換、サーチにて大文字、小文字を区別する
- OPTPUBLIC
- PUBLIC変数の重複定義を禁止する
- OPTFINALLY
- TRY-FINALLY間で強制終了が発生した時にも必ずFINALLY部を実行する
- SPECIALCHAR
- 実行時に特殊文字(<#CR>, <#DBL>, <#TAB>)の変換をしない
- SHORTCIRCUIT
- 論理演算(IF, IFB, WHILE, REPEAT)にて短絡評価をする(但しカッコ内は無効)。詳細は短絡評価を参照。
- NOSTOPHOTKEY
- 停止ホットキーは無効にする
- TOPSTOPFORM
- STOPボタンウィンドウを最前面固定する
- FIXBALLOON
- 吹き出しを仮想デスクトップの全画面に出す
- DEFAULTFONT = フォント名
- フォント, サイズを変更する(BALLOON, MSGBOX等)
- POSITION = X, Y
- 位置を変更する
- LOGPATH = ログパス名
- ログファイルのパス、ファイル名を変更する
- LOGLINES = ログ行数
- ログ最大行数を変更する
- LOGFILE = ログ出力モード
- ログファイルの出力 = 1:出力しない、2:日付を付けない、3:秒もつける、4:以前のログは削除
- DLGTITLE = タイトル
- INPUT, MSGBOX, SLCTBOXでのタイトルを変更する
- 引数
- 戻り値
スクリプトの先頭で宣言、各種設定の変更(,カンマにて項目の複数指定可)
OPTION EXPLICIT // 変数宣言の強制
OPTION SAMESTR // 大文字・小文字を区別
OPTION OPTPUBLIC // PUBLICの重複定義を禁止
OPTION OPTFINALLY // FINALLY部を実行
OPTION SPECIALCHAR // 特殊文字の変換をしない
OPTION SHORTCIRCUIT // 短絡評価をする
OPTION NOSTOPHOTKEY // 停止ホットキーを無効
OPTION TOPSTOPFORM // STOPボタンウィンドウを最前面固定
OPTION FIXBALLOON // 吹き出しを仮想デスクトップの全画面
OPTION DEFAULTFONT // フォント, サイズを変更
OPTION POSITION // 位置を変更
OPTION LOGPATH // ログファイルのパスを変更
OPTION LOGLINES // ログの最大行数を変更
OPTION LOGFILE // ログ出力モード
OPTION DLGTITLE // ダイアログのタイトル変更
使い方
変数宣言の強制(EXPLICIT)
変数の宣言を強制します。すべての変数でDIMまたはPUBLICでの宣言が必要になります。
UWSCでは変数の宣言を省略して変数に直接代入することができます。
a = 1
b = 2
PRINT a + b
- 結果
3
OPTION EXPLICITを宣言すると、定義されていない変数を最初に使用した箇所でエラーが発生します。以下では変数: A が定義されていませんとエラーが発生します。
OPTION EXPLICIT
a = 1
b = 2
PRINT a + b
大文字・小文字を区別(SAMESTR)
文字比較、置換、サーチの際に、大文字・小文字の区別をします。
大文字と小文字の区別を行わないので、Aとaは同じ文字として扱われTrueを返します。
IFB "A" = "a" THEN
PRINT TRUE
ELSE
PRINT FALSE
ENDIF
- 結果
True
OPTION SAMESTRを宣言すると大文字と小文字の区別を行うので、Aとaは別の文字として扱われFalseを返します。
OPTION SAMESTR
IFB "A" = "a" THEN
PRINT TRUE
ELSE
PRINT FALSE
ENDIF
- 結果
False
以下はabcdの中からCが最初に見つかった位置を返します。大文字と小文字の区別を行わないので、最初のcの位置である3を返します。
PRINT POS("C", "abcd")
- 結果
3
以下の場合は大文字と小文字の区別をするので、Cは見つからず0を返します。
OPTION SAMESTR
PRINT POS("C", "abcd")
- 結果
0
OPTION SAMESTRを使用しているときにスクリプトの一部にのみ大文字・小文字の区別をしたくない場合、比較対象の文字列をSTRCONV関数 (スクリプト関数)で大文字(SC_UPPERCASE)もしくは小文字(SC_LOWERCASE)のどちらかに統一させます。
以下はAとaの比較を行うプログラムで、OPTION SAMESTRの宣言で大文字・小文字を区別していますがSTRCONV関数 (スクリプト関数)で大文字に変換しAとAの比較になるので、Trueを返します。
OPTION SAMESTR
IFB STRCONV("A", SC_UPPERCASE) = STRCONV("a", SC_UPPERCASE) THEN
PRINT TRUE
ELSE
PRINT FALSE
ENDIF
- 結果
True
PUBLICの重複定義の禁止(OPTPUBLIC)
PUBLIC変数の重複定義を禁止します。
FINALLY部を実行(OPTFINALLY)
TRY-FINALLY間で強制終了が発生した時にも必ずFINALLY部を実行します。
通常例外処理ではTRY節を実行した後、FINALLY節が実行されます。
TRY
PRINT "TRY節"
FINALLY
PRINT "FINALLY節"
ENDTRY
- 結果
TRY節 FINALLY節
TRY節にEXITEXIT文が書かれていると、FINALLY節は実行されずに終了します。
TRY
PRINT "TRY節"
EXITEXIT
FINALLY
PRINT "FINALLY節"
ENDTRY
- 結果
TRY節
OPTION OPTFINALLYが宣言されているとEXITEXIT文が書かれていてもFINALLY節が実行されます。
OPTION OPTFINALLY
TRY
PRINT "TRY節"
EXITEXIT
FINALLY
PRINT "FINALLY節"
ENDTRY
- 結果
TRY節 FINALLY節
OPTION OPTFINALLYを宣言したらFINALLY節は実行されますが、TRY節のEXITEXIT以降は実行されません。
以下の場合、TRY節2は出力されません。
OPTION OPTFINALLY
TRY
PRINT "TRY節1"
EXITEXIT
PRINT "TRY節2"
FINALLY
PRINT "FINALLY節"
ENDTRY
- 結果
TRY節1 FINALLY節
特殊文字の変換をしない(SPECIALCHAR)
実行時に特殊文字の変換を行わずに、そのまま文字列として出力します。
短絡評価をする(SHORTCIRCUIT)
論理演算で短絡評価をします。宣言を行わなかったときは完全評価をします。詳細は短絡評価を参照。
停止ホットキーを無効(NOSTOPHOTKEY)
停止ホットキーを無効にします。現在割り当てられている停止ホットキーはUWSCの設定画面、または以下のプログラムで取得できます。UWSC.INIのSETセクション-StopHotKeyの値がホットキーを表す数値です。UWSC.INIの見方はUWSC.INIを参照。
DIM modifers[] = "CTRL", "WIN", "ALT", "SHIFT+CTRL", "SHIFT+ALT", "CTRL+ALT"
DIM keys[] = "SPACE", "F1", "F2", "F3", "F4", "F9", "F10", "F11", "F12", "↑", _
"↓", "→", "←", "Q", "W", "E", "R", "A", "S", "D", _
"F", "End", "Home", "F5", "F6", "F7", "F8", "T", "Y", "U", _
"I", "O", "P", "G", "H", "J", "K", "L", "Z", "X", _
"C", "V", "B", "N", "M", "1", "2", "3", "4", "5", _
"6", "7", "8", "9"
DIM WshShell = CREATEOLEOBJ("WScript.Shell")
DIM username = WshShell.ExpandEnvironmentStrings("%USERNAME%")
DIM str = READINI("SET", "StopHotKey", "C:\Users\" + username + "\AppData\Roaming\UWSC\UWSC.INI")
DIM nums = SPLIT(str, ",")
PRINT modifers[nums[0]] + " + " + keys[nums[1]]
- 結果
ALT + F2
STOPボタンウィンドウを最前面固定(TOPSTOPFORM)
STOPボタンウィンドウを最前面固定にします。
吹き出しを仮想デスクトップの全画面(FIXBALLOON)
吹き出しを仮想デスクトップの全画面に出します。
フォント, サイズを変更(DEFAULTFONT)
BALLOON関数 (スクリプト関数)、FUKIDASI関数 (スクリプト関数)、MSGBOX関数 (スクリプト関数)等でのフォントの設定を変更します。
位置を変更(POSITION)
ログファイルのパスを変更(LOGPATH)
PRINT文実行時に出力するログのファイルのパスを指定します。
指定したパスにファイルがなければ自動的に生成されます。
OPTION LOGPATH = "D:\Desktop\UWSC.LOG"
C:\Users\akita\AppData\Roaming\UWSC\UWSC.LOG // UWSCのログ
C:\Users\akita\AppData\Roaming\UWSC\UDEBUG.LOG // UWSC Debuggerのログ
LOGPATHに指定できるのは文字列のみで、以下のようにLOGPATHに変数を使用することはできません。
CONST ssfDesktop = 0
DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(ssfDesktop)
OPTION LOGPATH = Folder.Self.Path + "\UWSC.LOG"
PRINT "ログ"
ログを出力するパスに変数を使用できるよう作成した関数です。stringに出力するログ、logpathにログを出力するパス、logfileにログの出力モード、loglinesに残すログの最大行数を指定します。
PUBLIC LogDeleteFlg = TRUE
PROCEDURE PRINT(string, logpath, logfile = 0, loglines = 2000)
GETTIME()
SELECT logfile MOD 4
CASE 0
DIM datetime = COPY(G_TIME_YY4, LENGTH(G_TIME_YY4)-1) + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + " "
CASE 1, 2
datetime = ""
CASE 3
datetime = COPY(G_TIME_YY4, LENGTH(G_TIME_YY4)-1) + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2 + " "
SELEND
IF ((logfile AND 4) <> 0) AND LogDeleteFlg THEN
DIM FID = FOPEN(logpath, F_READ OR F_WRITE)
FPUT(FID, "", F_ALLTEXT)
FCLOSE(FID)
LogDeleteFlg = FALSE
ENDIF
FID = FOPEN(logpath, F_READ OR F_WRITE)
FPUT(FID, datetime + string, 0, F_INSERT)
FCLOSE(FID)
FUKIDASI(string)
SLEEP(0.010)
FUKIDASI()
FID = FOPEN(logpath, F_READ OR F_WRITE)
DIM Maxrow = FGET(FID, F_LINECOUNT)
DIM cnt = 0
FOR row = Maxrow TO 1 STEP -1
IF reTest(FGET(FID, row), "\d{2}\/\d{2}\/\d{2} \d{2}:\d{2}(?::\d{2})? ") THEN cnt = cnt + 1
IF cnt = loglines THEN BREAK
NEXT
DIM str = ""
FOR i = row TO MaxRow
str = str + FGET(FID, i) + "<#CR>"
NEXT
FPUT(FID, str, F_ALLTEXT)
FCLOSE(FID)
FEND
//////////////////////////////////////////////////
// 【引数】
// str : 正規表現による検索の対象となる文字列
// Pattern : 正規表現で使用するパターンを設定
// IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse
// Global : 文字列全体を検索する場合はTrue、しない場合はFalse
// 【戻り値】
// 正規表現にマッチするかどうかを示すブール値
//////////////////////////////////////////////////
FUNCTION reTest(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
DIM re = CREATEOLEOBJ("VBScript.RegExp")
re.Pattern = Pattern
re.IgnoreCase = IgnoreCase
re.Global = Global
RESULT = re.Test(str)
FEND
以下はPRINT関数の解説です。
PUBLIC LogDeleteFlg = TRUE
以前のログを削除するためのグローバル変数。メインルーチンから初めてPRINT関数が呼び出されたときのみ実行するための変数です。ログが削除されたらFALSEが代入されます。
PROCEDURE PRINT(string, logpath, logfile = 0, loglines = 2000)
GETTIME()
SELECT logfile MOD 4
CASE 0
DIM datetime = COPY(G_TIME_YY4, LENGTH(G_TIME_YY4)-1) + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + " "
CASE 1, 2
datetime = ""
CASE 3
datetime = COPY(G_TIME_YY4, LENGTH(G_TIME_YY4)-1) + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2 + " "
SELEND
ログを出力された日時をdatetimeに代入します。logfileの値によって日時の形式が変わります。logfileが0のときはyy/mm/dd hh:nn、1または2のときは値なし、3のときはyy/mm/dd hh:nn:ssの形式で現在の時刻を代入します。
IF ((logfile AND 4) <> 0) AND LogDeleteFlg THEN
DIM FID = FOPEN(logpath, F_READ OR F_WRITE)
FPUT(FID, "", F_ALLTEXT)
FCLOSE(FID)
LogDeleteFlg = FALSE
ENDIF
logfileの値の第2ビット(数値を2進数にして右から3桁目の値)が1、かつ、LogDeleteFlgがTRUE(以前のログの削除をまだ行っていない)の場合、logpath内のテキストをすべて削除します。
以下はlogfileの値と4との論理演算を行ったときの例。論理演算の結果が4になるとき以前のログを削除する処理を行っています。
FOR logfile = 0 TO 20
PRINT logfile + "," + decToBin(logfile) + "," + (logfile AND 4)
NEXT
- 結果
0, 00000000, 0 1, 00000001, 0 2, 00000010, 0 3, 00000011, 0 4, 00000100, 4 5, 00000101, 4 6, 00000110, 4 7, 00000111, 4 8, 00001000, 0 9, 00001001, 0 10, 00001010, 0 11, 00001011, 0 12, 00001100, 4 13, 00001101, 4 14, 00001110, 4 15, 00001111, 4 16, 00010000, 0 17, 00010001, 0 18, 00010010, 0 19, 00010011, 0 20, 00010100, 4
FID = FOPEN(logpath, F_READ OR F_WRITE)
FPUT(FID, datetime + string, 0, F_INSERT)
FCLOSE(FID)
FUKIDASI(string)
SLEEP(0.010)
FUKIDASI()
datetime(日時)とstring(ログの内容)を結合した文字列をlogpathに書き込みます。書き込む内容をPRINT文で記述するとログとして書き込まれてしまうのでFUKIDASI関数 (スクリプト関数)でログを表示しています。
FID = FOPEN(logpath, F_READ OR F_WRITE)
DIM Maxrow = FGET(FID, F_LINECOUNT)
DIM cnt = 0
FOR row = Maxrow TO 1 STEP -1
IF reTest(FGET(FID, row), "\d{2}\/\d{2}\/\d{2} \d{2}:\d{2}(?::\d{2})? ") THEN cnt = cnt + 1
IF cnt = loglines THEN BREAK
NEXT
DIM str = ""
FOR i = row TO MaxRow
str = str + FGET(FID, i) + "<#CR>"
NEXT
FPUT(FID, str, F_ALLTEXT)
FCLOSE(FID)
loglinesに指定された行数分のログを残す処理を行っています。現在のログの行数を取得し、まず後ろから何行分取得すれば良いかを求めます。改行を含むログが出力される可能性もあるため、単純に後ろからloglinesの値だけ取得するということはできません。
ログは行頭に日時が必ず来るため、正規表現で行頭に日時が来る行をカウントしていきcntに代入します。cntがloglinesの値と一致したとき、ループを抜けます。このときのrowの値がちょうどloglinesに一致するログの開始行となります。この行以降を取得すればloglinesに一致する分のログが取得できることになります。ループでstrにログを代入していき、最後にstrで全文書き換えを行いログを書き換えます。
loglinesに指定された数のログを取得し、strに代入していきます。
LogDeleteFlgは以前のログを削除するためのグローバル変数です。
以下はデスクトップ\UWSC.LOGにテキストと出力します。logfileが3(以前のログを残し、yy/mm/dd hh:nn:ss <ログの内容>の形式で出力)、loglinesが10(残すログの行数が10行)です。
PUBLIC LogDeleteFlg = TRUE
CONST ssfDesktop = 0
DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(ssfDesktop)
DIM path = Folder.Self.Path + "\UWSC.LOG"
PRINT("テキスト", path, 3, 10)
ログの最大行数を変更(LOGLINES)
ログファイルの最大行数を変更します。デフォルトは2,000行です。
OPTION LOGLINES = 500
ログ出力モード(LOGFILE)
ログの出力モードを指定します。
OPTION指定の書き方は以下のとおりです。
OPTION LOGFILE = <数値>
数値 | 以前のログ 削除フラグ |
形式 |
---|---|---|
0(デフォルト) | ○残す | yy/mm/dd hh:nn <ログの内容> |
1 | ○残す | (ログを出力しない) |
2 | ○残す | <ログの内容> |
3 | ○残す | yy/mm/dd hh:nn:ss <ログの内容> |
4 | ×削除 | yy/mm/dd hh:nn <ログの内容> |
5 | ×削除 | (ログを出力しない) |
6 | ×削除 | <ログの内容> |
7 | ×削除 | yy/mm/dd hh:nn:ss <ログの内容> |
8 | ○残す | yy/mm/dd hh:nn <ログの内容> |
9 | ○残す | (ログを出力しない) |
10 | ○残す | <ログの内容> |
11 | ○残す | yy/mm/dd hh:nn:ss <ログの内容> |
12 | ×削除 | yy/mm/dd hh:nn <ログの内容> |
13 | ×削除 | (ログを出力しない) |
14 | ×削除 | <ログの内容> |
15 | ×削除 | yy/mm/dd hh:nn:ss <ログの内容> |
16 | ○残す | yy/mm/dd hh:nn <ログの内容> |
17 | ○残す | (ログを出力しない) |
18 | ○残す | <ログの内容> |
19 | ○残す | yy/mm/dd hh:nn:ss <ログの内容> |
20 | ×削除 | yy/mm/dd hh:nn <ログの内容> |
表に示した結果から以下のような法則が成り立ちます。
数値を2進数にしたときの下位2ビットの値もしくは数値を4で割った余りでログの形式が決まります。
- 00(余り0)
- yy/mm/dd hh:nn <ログの内容>
- 01(余り1)
- ログを出力しない
- 10(余り2)
- <ログの内容>
- 11(余り3)
- yy/mm/dd hh:nn:ss <ログの内容>
下位3ビット目が1なら以前のログを削除、0なら削除しない。
以前のログはスクリプトで最初のPRINT文を実行し、 ログを出力したタイミングで削除されます。5,13は×削除ですが、ログが出力されないので以前のログは残ります。
ダイアログのタイトル変更(DLGTITLE)
ダイアログのタイトル変更
短絡評価
短絡評価とは、ANDやORといった論理演算子において左辺を評価した時点で全体の真偽値が確定し右辺を評価する必要がない場合、右辺の評価をしないのが短絡評価です。一方で左辺・右辺ともに評価を行うのは完全評価といいます。
例えば、論理積(AND)の左辺を評価した結果がFALSEの場合、全体の評価はFALSEになるし、論理和(OR)の左辺を評価した結果がTRUEの場合、全体の評価はTRUEになります。
まず論理積(AND)の場合、左辺の評価がTRUEのときは右辺の評価もしなければならないが、左辺の評価がFALSEのときは右辺の評価に関わらず結果は必ずFALSEとなります。そのため左辺がFALSEの時点で右辺の評価はスキップします。
- TRUE AND TRUE → TRUE
- TRUE AND FALSE → FALSE
- FALSE AND TRUE → FALSE
- FALSE AND FALSE → FALSE
このような場合、右辺の結果は問わないので評価をスキップします。赤字の式は評価されずスキップします。
次に論理和(OR)の場合、左辺の評価がFALSEの場合右辺の評価しなければならないが、左辺の評価がTRUEのときは右辺の評価に関わらず結果は必ずTRUEになります。そのため左辺がTRUEの時点で右辺の評価はスキップします。
- TRUE OR TRUE → TRUE
- TRUE OR FALSE → TRUE
- FALSE OR TRUE → TRUE
- FALSE OR FALSE → FALSE
論理積のときと同様に赤字の処理はスキップされます。
そのため軽い処理を左辺、重い処理を右辺に持ってくると右辺が省略されるときは無駄な処理をせずに済みます。
左辺は必ず実行されるので、省略されては困る式を左辺に持ってくる書き方もありです。
以下の例ではOPTION SHORTCIRCUITの記述があるとORの左辺がTRUEなので右辺の処理を実行せずFalseを返し、記述がないと右辺も実行するのでTrueを返します。
PUBLIC flg
flg = FALSE
IF TRUE OR test() THEN PRINT flg
PROCEDURE test()
flg = TRUE
FEND
- 結果
True
OPTION SHORTCIRCUIT
PUBLIC flg
flg = FALSE
IF TRUE OR test() THEN PRINT flg
PROCEDURE test()
flg = TRUE
FEND
- 結果
False
論理積・論理和を使った擬似的なIF文
論理積
左辺 AND 右辺
論理積の場合左辺がTRUEでないと右辺は実行されないので、
IF 左辺 = TRUE THEN 右辺
と等価とみなすことができます。左辺が条件式、右辺が真のときの処理となる。
論理和
左辺 OR 右辺
論理和の場合左辺がFALSEでないと右辺は実行されないので、
IF 左辺 = FALSE THEN 右辺
と等価とみなすことができます。左辺の条件式が偽のとき右辺の処理が実行されます。
論理演算子が複数あるとき
論理演算子が複数あるときも1つのときと同様に左から順に評価していきます。
論理積(AND)の場合、初めてFALSEを返した次以降の処理をスキップします。赤字がスキップされる処理です。
- FALSE AND FALSE AND FALSE → FALSE
- FALSE AND FALSE AND TRUE → FALSE
- FALSE AND TRUE AND FALSE → FALSE
- FALSE AND TRUE AND TRUE → FALSE
- TRUE AND FALSE AND FALSE → FALSE
- TRUE AND FALSE AND TRUE → FALSE
- TRUE AND TRUE AND FALSE → FALSE
- TRUE AND TRUE AND TRUE → TRUE
論理和(OR)の場合、初めてTRUEを返した次以降の処理をスキップします。赤字がスキップされる処理です。
- FALSE OR FALSE OR FALSE→FALSE
- FALSE OR FALSE OR TRUE→TRUE
- FALSE OR TRUE OR FALSE→TRUE
- FALSE OR TRUE OR TRUE→TRUE
- TRUE OR FALSE OR FALSE→TRUE
- TRUE OR FALSE OR TRUE→TRUE
- TRUE OR TRUE OR FALSE→TRUE
- TRUE OR TRUE OR TRUE→TRUE
注意点
短絡評価は場合によって右辺の式スキップされるため、その式に関係する処理を行う場合注意が必要です。
短絡評価の例
以下は完全評価のため、fa、fbともに呼び出されます。
IFB fa(FALSE) AND fb(FALSE) THEN
// 処理
ENDIF
FUNCTION fa(arg)
PRINT "faが呼び出されました"
RESULT = arg
FEND
FUNCTION fb(arg)
PRINT "fbが呼び出されました"
RESULT = arg
FEND
- 結果
faが呼び出されました fbが呼び出されました
以下は短絡評価で、まずfaを実行しTRUEを返したため、fbも実行されます。
OPTION SHORTCIRCUIT
IFB fa(TRUE) AND fb(TRUE) THEN
// 処理
ENDIF
FUNCTION fa(arg)
PRINT "faが呼び出されました"
RESULT = arg
FEND
FUNCTION fb(arg)
PRINT "fbが呼び出されました"
RESULT = arg
FEND
- 結果
faが呼び出されました fbが呼び出されました
まずfaが実行されFALSEを返しこの時点でこの論理積の評価がFALSEと確定したので、fbは実行されません。
OPTION SHORTCIRCUIT
IFB fa(FALSE) AND fb(TRUE) THEN
// 処理
ENDIF
FUNCTION fa(arg)
PRINT "faが呼び出されました"
RESULT = arg
FEND
FUNCTION fb(arg)
PRINT "fbが呼び出されました"
RESULT = arg
FEND
- 結果
faが呼び出されました
以下は完全評価で、fa、fbともに呼び出されます。
IFB fa(TRUE) OR fb(TRUE) THEN
// 処理
ENDIF
FUNCTION fa(arg)
PRINT "faが呼び出されました"
RESULT = arg
FEND
FUNCTION fb(arg)
PRINT "fbが呼び出されました"
RESULT = arg
FEND
- 結果
faが呼び出されました fbが呼び出されました
以下は短絡評価で、まずfaが実行されTRUEを返しこの時点でこの論理和の評価がTRUEと確定したので、fbは実行されません。
OPTION SHORTCIRCUIT
IFB fa(TRUE) OR fb(TRUE) THEN
// 処理
ENDIF
FUNCTION fa(arg)
PRINT "faが呼び出されました"
RESULT = arg
FEND
FUNCTION fb(arg)
PRINT "fbが呼び出されました"
RESULT = arg
FEND
- 結果
faが呼び出されました
以下は短絡評価で、まずfaを実行しFALSEを返したため、fbも実行されます。
OPTION SHORTCIRCUIT
IFB fa(FALSE) OR fb(TRUE) THEN
// 処理
ENDIF
FUNCTION fa(arg)
PRINT "faが呼び出されました"
RESULT = arg
FEND
FUNCTION fb(arg)
PRINT "fbが呼び出されました"
RESULT = arg
FEND
- 結果
faが呼び出されました fbが呼び出されました