OSの違いへの対応

クロスプラットフォームのアプリケーションやライブラリを書く場合,しばしばOSの違いを考慮する 必要があります.このような場合には,変数Sys.KERNELを使用して対応することができます. Sysモジュールには,isunixislinuxisappleisbsdisfreebsdiswindows といった,これを容易にするための関数がいくつか用意されています.これらは以下のように使用できます:

if Sys.iswindows()
    windows_specific_thing(a)
end

ここで,islinuxisappleisfreebsdは互いに排他的なisunixのサブセットであることに 注意してください.また@staticというマクロがあり,これらの関数を使って正しくないコードを 条件付きで隠すことができます.以下にその例を示します.

シンプルなブロック:

ccall((@static Sys.iswindows() ? :_fopen : :fopen), ...)

複雑なブロック:

@static if Sys.islinux()
    linux_specific_thing(a)
else
    generic_thing(a)
end

条件式を(if/elseif/endを含みながら)連鎖させる場合,@staticは各レベルで繰り返し 書かれる必要があります(括弧を付けるかどうかは任意ですが,読みやすさのために推奨されます).

@static Sys.iswindows() ? :a : (@static Sys.isapple() ? :b : :c)