Juliaでは @unix_only とか @windows_only などのマクロが用意されていて、UNIX系とWindowsで手軽に処理を書き分けることができる。
今回はこの辺りの機能を確認する。
試しに下記のように書いてみる。
@unix_only println("こんにちは")
@windows_only println("ばーかばーか")
これをうちの環境で実行すると、標準出力に「こんにちは」と表示される。
複数行の処理を書きたい場合は、begin 〜 endで。
@unix_only begin
println("こんにちは")
println("UNIX系の人")
end
@windows_only begin
println("こんにちは")
println("Windows系の人")
end
unix判定しているところの処理は下記。
function is_unix(os::Symbol)
if (os==:Windows) return false;
elseif (os==:Linux) return true;
elseif (os==:FreeBSD) return true;
elseif (os==:Darwin) return true;
else error("unknown operating system")
end
end
Linux, FreeBSD, Darwin(OSX)がis_unixの対象になっているようだ。Solarisとかはどう判定されるんだろう。まあ、自分は使わないからいいか。
ざっとソースを見たところ、この手のマクロには下記が用意されているようだ。
@windows_only @unix_only @linux_only @osx_only @windowsxp_only
参照したコードはosutils。
https://github.com/JuliaLang/julia/blob/master/base/osutils.jl
下記のコードを実行すれば、自分のOSでどれで判定されているかわかる。
@windows_only print("Windowsですね")
@unix_only print("UNIX系OSですね")
@linux_only print("Linuxですね")
@osx_only print("OSXですね")
@windowsxp_only print("えっ、Windows XP使ってるの?")
ちなみにWindowsXPの判定は下記になっている。
WINDOWS_XP_VER = (5,1) macro windowsxp(qm,ex) _os_test(qm, ex, OS_NAME===:Windows && windows_version() >= INDOWS_XP_VER) end
この記述だとMEとか2000でもtrueになるのかな? そんな古いのはもう持ってないから実際どうなるかはわからない。