Merge pull request #104 from dubek/hashmap-equality-test
[jackhill/mal.git] / julia / core.jl
index 58da730..ddfdd2a 100644 (file)
@@ -8,9 +8,9 @@ import readline_mod
 export ns
 
 function concat(args...)
-    res = {}
+    res = []
     for a=args
-        res = [res, Any[a...]]
+        res = [res; Any[a...]]
     end
     res
 end
@@ -27,7 +27,7 @@ function with_meta(obj, meta)
     new_obj
 end
 
-ns = {
+ns = Dict{Any,Any}(
     symbol("=") => (a,b) -> types.equal_Q(a, b),
     :throw => (a) -> throw(types.MalException(a)),
 
@@ -37,7 +37,7 @@ ns = {
     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),""),
@@ -55,6 +55,7 @@ ns = {
     :- => -,
     symbol("*") => *,
     :/ => div,
+    symbol("time-ms") => () -> round(Int, time()*1000),
 
     :list => (a...) -> Any[a...],
     symbol("list?") => (a) -> isa(a, Array),
@@ -66,11 +67,11 @@ ns = {
     :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),
@@ -78,7 +79,7 @@ ns = {
     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,
 
@@ -89,6 +90,6 @@ ns = {
     :deref => (a) -> a.val,
     :reset! => (a,b) -> a.val = b,
     :swap! => (a,b,c...) -> a.val = do_apply(b, a.val, c),
-    }
+    )
 
 end