forked from JuliaLang/julia
-
Notifications
You must be signed in to change notification settings - Fork 0
/
osutils.jl
30 lines (27 loc) · 1011 Bytes
/
osutils.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# This file is a part of Julia. License is MIT: https://julialang.org/license
"""
@static
Partially evaluate an expression at parse time.
For example, `@static Sys.iswindows() ? foo : bar` will evaluate `Sys.iswindows()` and insert
either `foo` or `bar` into the expression.
This is useful in cases where a construct would be invalid on other platforms,
such as a `ccall` to a non-existent function.
`@static if Sys.isapple() foo end` and `@static foo <&&,||> bar` are also valid syntax.
"""
macro static(ex)
if isa(ex, Expr)
if ex.head === :if || ex.head === :&& || ex.head === :||
cond = eval(__module__, ex.args[1])
if xor(cond, ex.head === :||)
return esc(ex.args[2])
elseif length(ex.args) == 3
return esc(ex.args[3])
elseif ex.head === :if
return nothing
else
return cond
end
end
end
throw(ArgumentError("invalid @static macro"))
end