kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Groovy(やgcc拡張)の?:演算子をOnionに追加してみた

Groovyには、?:という演算子があって、たとえば、

x ?: y

という式があった場合、

x != null ? x : y

と同じような働きをする(xの評価が2回行われない事を除いて)。で、これと同じ働きをする演算子をOnionにも追加してみた。使い方はGroovyのそれとほぼ同じ。たとえば、以下のようなコードが動作する。

x: String = null;
if(args.length > 0) {
  x = args[0];
}
System::out.println(x ?: "BAR");

コマンドライン引数が無い場合は、xがnullなので、"BAR"が表示され、そうでない場合、最初のコマンドライン引数が表示される。

ちなみに、Onionで型チェックやコード生成を行うやり方を思い出すためのリハビリがてらに追加してみただけなので、そのうち削除するかも。

追記:
id:SiroKuroさんのブクマコメントより:

よく確認していないけど C# の ?? 演算子と同じ?

同じですね。以前、??演算子は調べたことあったんですが、馴染みが無かった
のですっかり忘れてました。

追記2:
@masahiro_sakaiさんより

@kmizu Groovyの ?: 演算子というか、起源はgccのような。

http://twitter.com/masahiro_sakai/statuses/1292379292

とのことです。時系列を考えると、"?:"演算子gcc拡張が起源ということなんでしょうね。

追記3:
Groovyのは?:演算子なのに、何故かタイプミスして:?演算子を実装してしまっていたので、修正。