forked from JuliaLang/julia
/
expr.jl
61 lines (50 loc) · 1.36 KB
/
expr.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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
## symbols ##
symbol(s::ASCIIString) = symbol(s.data)
symbol(s::UTF8String) = symbol(s.data)
symbol(a::Array{Uint8,1}) =
ccall(:jl_symbol_n, Any, (Ptr{Uint8}, Int32), a, length(a))::Symbol
gensym() = ccall(:jl_gensym, Any, ())::Symbol
gensym(n::Integer) = ntuple(n, i->gensym())
type UniqueNames
names::Array{Any,1}
UniqueNames() = new({})
end
let _names = {}
global gensym
function gensym(u::UniqueNames)
nu = length(u.names)
if nu >= length(_names)
push(_names, gensym())
end
s = _names[nu+1]
push(u.names, s)
return s
end
end
## expressions ##
expr(hd::Symbol, args::ANY...) = Expr(hd, {args...}, Any)
expr(hd::Symbol, args::Array{Any,1}) = Expr(hd, args, Any)
copy(e::Expr) = Expr(e.head, isempty(e.args) ? e.args : copy(e.args), e.typ)
copy(s::SymbolNode) = SymbolNode(s.name, s.typ)
isequal(x::Expr, y::Expr) = (is(x.head,y.head) && isequal(x.args,y.args))
isequal(x::SymbolNode, y::SymbolNode) = is(x.name,y.name)
isequal(x::SymbolNode, y::Symbol) = is(x.name,y)
isequal(x::Symbol , y::SymbolNode) = is(x,y.name)
function show(tv::TypeVar)
if !is(tv.lb, None)
show(tv.lb)
print("<:".data)
end
print(tv.name)
if !is(tv.ub, Any)
print("<:".data)
show(tv.ub)
end
end
## misc syntax ##
macro eval(x)
:(eval($expr(:quote,x)))
end
macro task(ex)
:(Task(()->$ex))
end