export ns
function concat(args...)
- res = {}
+ res = []
for a=args
- res = [res, Any[a...]]
+ res = [res; Any[a...]]
end
res
end
new_obj
end
-ns = {
+ns = Dict{Any,Any}(
symbol("=") => (a,b) -> types.equal_Q(a, b),
:throw => (a) -> throw(types.MalException(a)),
symbol("symbol") => (a) -> symbol(a),
symbol("symbol?") => (a) -> typeof(a) === Symbol,
symbol("keyword") => (a) -> a[1] == '\u029e' ? a : "\u029e$(a)",
- symbol("keyword?") => (a) -> isa(a,String) && a[1] == '\u029e',
+ symbol("keyword?") => (a) -> isa(a,AbstractString) && a[1] == '\u029e',
symbol("pr-str") => (a...) -> join(map((e)->pr_str(e, true),a)," "),
:str => (a...) -> join(map((e)->pr_str(e, false),a),""),
:- => -,
symbol("*") => *,
:/ => div,
+ symbol("time-ms") => () -> round(Int, time()*1000),
:list => (a...) -> Any[a...],
symbol("list?") => (a) -> isa(a, Array),
:dissoc => (a, b...) -> foldl((x,y) -> delete!(x,y),copy(a), b),
:get => (a,b) -> a === nothing ? nothing : get(a,b,nothing),
symbol("contains?") => haskey,
- :keys => (a) -> {keys(a)...},
- :vals => (a) -> {values(a)...},
+ :keys => (a) -> [keys(a)...],
+ :vals => (a) -> [values(a)...],
symbol("sequential?") => types.sequential_Q,
- :cons => (a,b) -> [Any[a], Any[b...]],
+ :cons => (a,b) -> [Any[a]; Any[b...]],
:concat => concat,
:nth => (a,b) -> b+1 > length(a) ? error("nth: index out of range") : a[b+1],
:first => (a) -> isempty(a) ? nothing : first(a),
symbol("empty?") => isempty,
:count => (a) -> a == nothing ? 0 : length(a),
:apply => do_apply,
- :map => (a,b) -> isa(a,types.MalFunc) ? {map(a.fn,b)...} : {map(a,b)...},
+ :map => (a,b) -> isa(a,types.MalFunc) ? [map(a.fn,b)...] : [map(a,b)...],
:conj => nothing,
:deref => (a) -> a.val,
:reset! => (a,b) -> a.val = b,
:swap! => (a,b,c...) -> a.val = do_apply(b, a.val, c),
- }
+ )
end