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になるのかな? そんな古いのはもう持ってないから実際どうなるかはわからない。