小ワザ
条件演算子を擬似的に実装してみる。 †
CやJava等の言語で実装されている演算子の一つです。
簡単に言うと、if文と値を返す関数を一つにしたような物です。
簡単な例を挙げます
a = (b == c) ? "true" : "false"
この構文の説明をすると、
代入先の変数 = (条件式) ? 真のときの値 : 偽のときの値
となります。
先ほどの例をとって説明すると、
b == cが成り立つ場合は a に "true" が代入され、
b == cが成り立たたない場合は a に "false" が代入されます。
これを条件演算子を使わないで書くと
if (b == c) {
a = "true"
} else {
b = "true"
}
のようになり、ソースが長くなってしまいます。
では、HSPではどのように条件演算子を実装するのでしょうか。
HSPでは先ほどの例を以下のような書き方もできます。
if b = c : a = "true" : else : a = "false"
これでもいいのですが、もっと簡潔に書きたいですよね。
HSPの構文上、一般的な条件演算子はマクロでも実装できないので、ここでは関数を自作して擬似的に実装します。
+
| | サンプルコード
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
| #runtime "hsp3cl"
#module _trinomial_operator
#ifndef __trinomial_operator__
#define __trinomial_operator__
#defcfunc witch_int int pCondition, int pTrueCase, int pFalseCase, local wReturn
if pCondition : wReturn = pTrueCase : else : wReturn = pFalseCase
return wReturn
#defcfunc witch_double int pCondition, double pTrueCase, double pFalseCase, local wReturn
if pCondition : wReturn = pTrueCase : else : wReturn = pFalseCase
return wReturn
#defcfunc witch_str int pCondition, str pTrueCase, str pFalseCase, local wReturn
if pCondition : wReturn = pTrueCase : else : wReturn = pFalseCase
return wReturn
#defcfunc witch_var int pCondition, var pTrueCase, var pFalseCase, local wReturn
if pCondition : wReturn = pTrueCase : else : wReturn = pFalseCase
return wReturn
#endif
#global
a = "var a"
b = "var b"
c = 5
mes witch_int(c = 5, 100, 200) mes witch_double(c > 5, 1.234, 4.321) mes witch_str(c != 5, "true", "false") mes witch_var(c & 4, a, b)
|
|
関数として新たにwitch_int,witch_double,witch_str,witch_varを定義しました。
witch_intを例に使い方を簡単に説明すると、以下のようになります。
witch_int(条件式, 真のときの値(int), 偽のときの値(int))
条件式が真であれば2番目の引数の値を、偽であれば3番目の引数を返します。
関数の内部では大したことはやってはいません。
ただ条件式を比較し、それに応じた戻り値を返しているだけです。
好みにもよりますが、if文を並べて書くよりは簡潔になります。
witch_int,witch_double,witch_str,witch_varの違いは、整数、実数、文字列、変数の違いだけです。
また、関数ですのでサンプルコードにあるように命令や関数の中に組み込むことが出来ます。
- if文の羅列が嫌いな方に。関数の定義で条件式の引数の型をintにしています。HSPでの比較演算の動作がよく解かるかもしれません。 -- 黒猫白狼?
- 「代入」と説明していますが、三項演算子は「代入」というよりも値を返す「関数」と条件式演算子が合体したみたいなものです。条件式にそって TRUE と FALSE の場合に別々の結果を返します。 -- Irisawa
- あ、言われて見れば確かに・・・。ご指摘どおり修正しておきました。ありがとう御座います。 -- 黒猫白狼?
- 三項演算子は文字通り項が三つある演算子の総称ですよ。ここでいっているのは条件演算子のことですね。 -- naznyark?
- 三項演算子というと、コレが一番最初にでてくるので勘違いしていたようです。ご指摘ありがとう御座います。 -- 黒猫白狼?
- まあ、この条件演算子の他に三項演算子って聴かないですけどね。他に三項演算子ってあるんでしょうか。 -- Irisawa
- 単項演算子・二項演算子と並べたときの条件演算子を三項演算子と呼ぶから「三項演算子」は総称だ、って言いたかったのでは?んで、三項演算子には条件演算子しか(今のところ)なければ、「三項演算子=条件演算子」という認識で(今のところ)支障はないんでしょう。 -- kz3
- でも、今後のことを考えるとwikiとしては条件演算子のほうがいいかもしれませんね。 -- 黒猫白狼?
- もしかして、Whichの間違い? -- UG?
- このモジュールの場合、witch_int(1,a(),b())としたときb()も評価されてしまいますよね(仕方ないですけど)。 -- FUJI?
- そこで、パラメータをスキップして評価しない witch をプラグインで作ってみました。 witch.zip -- FUJI?
- whichだな。 --