49 lines
1.3 KiB
Julia
49 lines
1.3 KiB
Julia
# This file is a part of Julia. License is MIT: https://julialang.org/license
|
|
|
|
module Meta
|
|
#
|
|
# convenience functions for metaprogramming
|
|
#
|
|
|
|
export quot,
|
|
isexpr,
|
|
show_sexpr
|
|
|
|
quot(ex) = Expr(:quote, ex)
|
|
|
|
isexpr(ex::Expr, head) = ex.head === head
|
|
isexpr(ex::Expr, heads::Union{Set,Vector,Tuple}) = in(ex.head, heads)
|
|
isexpr(ex, head) = false
|
|
|
|
isexpr(ex, head, n::Int) = isexpr(ex, head) && length(ex.args) == n
|
|
|
|
|
|
# ---- show_sexpr: print an AST as an S-expression ----
|
|
|
|
show_sexpr(ex) = show_sexpr(STDOUT, ex)
|
|
show_sexpr(io::IO, ex) = show_sexpr(io, ex, 0)
|
|
show_sexpr(io::IO, ex, indent::Int) = show(io, ex)
|
|
|
|
const sexpr_indent_width = 2
|
|
|
|
function show_sexpr(io::IO, ex::QuoteNode, indent::Int)
|
|
inner = indent + sexpr_indent_width
|
|
print(io, "(:quote, #QuoteNode\n", " "^inner)
|
|
show_sexpr(io, ex.value, inner)
|
|
print(io, '\n', " "^indent, ')')
|
|
end
|
|
function show_sexpr(io::IO, ex::Expr, indent::Int)
|
|
inner = indent + sexpr_indent_width
|
|
print(io, '(')
|
|
show_sexpr(io, ex.head, inner)
|
|
for arg in ex.args
|
|
print(io, ex.head === :block ? ",\n"*" "^inner : ", ")
|
|
show_sexpr(io, arg, inner)
|
|
end
|
|
if isempty(ex.args); print(io, ",)")
|
|
else print(io, (ex.head === :block ? "\n"*" "^indent : ""), ')')
|
|
end
|
|
end
|
|
|
|
end # module
|