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)