OS 間の差異

クロスプラットフォームのアプリケーションやライブラリを書くときは、様々な箇所で OS 間の差異を吸収する必要があります。そのような状況で利用できるのが変数 Sys.KERNEL です。Sys モジュールには isunix, islinux, isapple, isbsd, isfreebsd, iswindows といった Sys.KERNEL 変数の利用を簡単にするための関数がいくつかあります。例えば次のように使います:

if Sys.iswindows()
    windows_specific_thing(a)
end

islinux, isapple, isfreebsd は互いに素な isunix の部分集合であることに注意してください。また @static マクロを使うと、これらの関数を使った条件判定に合致しないコードを静的に隠すことができます。このマクロは以下の例で使われています。

@static を使った単純なブロックの隠蔽の例:

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

@static を使った複雑なブロックの隠蔽:

@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)