aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-04-15 01:24:43 -0500
committerJoel Martin <github@martintribe.org>2014-04-15 01:24:43 -0500
commit7e9a2883fe5c25a521b1dc37e4c549e1ed508ece (patch)
treeb444224dae6db978d4b5902f2a5b37046ba40d3e
parenta2849f89e7892feee256169398b1d2d82a2b8231 (diff)
downloadmal-7e9a2883fe5c25a521b1dc37e4c549e1ed508ece.tar.gz
mal-7e9a2883fe5c25a521b1dc37e4c549e1ed508ece.zip
All: fix get. All pass stepA tests.
-rw-r--r--bash/core.sh4
-rw-r--r--c/core.c2
-rw-r--r--cs/core.cs8
-rw-r--r--java/src/main/java/mal/core.java16
-rw-r--r--java/src/main/java/mal/step6_file.java2
-rw-r--r--java/src/main/java/mal/step7_quote.java2
-rw-r--r--js/core.js2
-rw-r--r--js/step2_eval.js1
-rw-r--r--js/step3_env.js1
-rw-r--r--js/step4_if_fn_do.js1
-rw-r--r--make/core.mk8
-rw-r--r--python/core.py2
-rw-r--r--ruby/core.rb2
13 files changed, 34 insertions, 17 deletions
diff --git a/bash/core.sh b/bash/core.sh
index 0da820c..d5750e6 100644
--- a/bash/core.sh
+++ b/bash/core.sh
@@ -145,7 +145,9 @@ _get () {
local obj="${ANON["${1}"]}"
eval r="\${${obj}[\"${2}\"]}" ;;
list|vector)
- _nth "${1}" "${2}"
+ _nth "${1}" "${2}" ;;
+ nil)
+ r="${__nil}" ;;
esac
}
get () {
diff --git a/c/core.c b/c/core.c
index 2a447e5..33bb991 100644
--- a/c/core.c
+++ b/c/core.c
@@ -182,6 +182,8 @@ MalVal *get(MalVal *obj, MalVal *key) {
} else {
return &mal_nil;
}
+ case MAL_NIL:
+ return &mal_nil;
default:
abort("get called on unsupported type %d", obj->type);
}
diff --git a/cs/core.cs b/cs/core.cs
index f8bd7ff..13f082e 100644
--- a/cs/core.cs
+++ b/cs/core.cs
@@ -87,8 +87,12 @@ namespace Mal {
static MalFunction get = new MalFunction(
a => {
string key = ((MalString)a[1]).getValue();
- var dict = ((MalHashMap)a[0]).getValue();
- return dict.ContainsKey(key) ? dict[key] : Nil;
+ if (a[0] == Nil) {
+ return Nil;
+ } else {
+ var dict = ((MalHashMap)a[0]).getValue();
+ return dict.ContainsKey(key) ? dict[key] : Nil;
+ }
});
static MalFunction keys = new MalFunction(
diff --git a/java/src/main/java/mal/core.java b/java/src/main/java/mal/core.java
index e1e6705..6ac4f8e 100644
--- a/java/src/main/java/mal/core.java
+++ b/java/src/main/java/mal/core.java
@@ -205,13 +205,17 @@ public class core {
static MalFunction get = new MalFunction() {
public MalVal apply(MalList a) throws MalThrowable {
- String key = ((MalString)a.nth(1)).getValue();
- MalHashMap mhm = (MalHashMap)a.nth(0);
- HashMap<String,MalVal> hm = (HashMap<String,MalVal>)mhm.value;
- if (hm.containsKey(key)) {
- return hm.get(key);
- } else {
+ if (a.nth(0) == Nil) {
return Nil;
+ } else {
+ String key = ((MalString)a.nth(1)).getValue();
+ MalHashMap mhm = (MalHashMap)a.nth(0);
+ HashMap<String,MalVal> hm = (HashMap<String,MalVal>)mhm.value;
+ if (hm.containsKey(key)) {
+ return hm.get(key);
+ } else {
+ return Nil;
+ }
}
}
};
diff --git a/java/src/main/java/mal/step6_file.java b/java/src/main/java/mal/step6_file.java
index 8d05b50..6a4c981 100644
--- a/java/src/main/java/mal/step6_file.java
+++ b/java/src/main/java/mal/step6_file.java
@@ -161,7 +161,7 @@ public class step6_file {
return reader.read_str(((MalString)args.nth(0)).getValue());
} catch (MalContinue c) {
return types.Nil;
- return reader.read_str(((MalString)args.nth(0)).getValue());
+ }
}
});
_ref(repl_env, "eval", new MalFunction() {
diff --git a/java/src/main/java/mal/step7_quote.java b/java/src/main/java/mal/step7_quote.java
index fbebb10..c46b4f0 100644
--- a/java/src/main/java/mal/step7_quote.java
+++ b/java/src/main/java/mal/step7_quote.java
@@ -192,7 +192,7 @@ public class step7_quote {
return reader.read_str(((MalString)args.nth(0)).getValue());
} catch (MalContinue c) {
return types.Nil;
- return reader.read_str(((MalString)args.nth(0)).getValue());
+ }
}
});
_ref(repl_env, "eval", new MalFunction() {
diff --git a/js/core.js b/js/core.js
index b8b0062..7addc49 100644
--- a/js/core.js
+++ b/js/core.js
@@ -51,7 +51,7 @@ function dissoc(src_hm) {
}
function get(hm, key) {
- if (key in hm) {
+ if (hm != null && key in hm) {
return hm[key];
} else {
return null;
diff --git a/js/step2_eval.js b/js/step2_eval.js
index f111a58..adcefe5 100644
--- a/js/step2_eval.js
+++ b/js/step2_eval.js
@@ -32,6 +32,7 @@ function eval_ast(ast, env) {
}
function _EVAL(ast, env) {
+ //printer.println("EVAL:", types._pr_str(ast, true));
if (!types._list_Q(ast)) {
return eval_ast(ast, env);
}
diff --git a/js/step3_env.js b/js/step3_env.js
index 1000437..86981d2 100644
--- a/js/step3_env.js
+++ b/js/step3_env.js
@@ -33,6 +33,7 @@ function eval_ast(ast, env) {
}
function _EVAL(ast, env) {
+ //printer.println("EVAL:", types._pr_str(ast, true));
if (!types._list_Q(ast)) {
return eval_ast(ast, env);
}
diff --git a/js/step4_if_fn_do.js b/js/step4_if_fn_do.js
index 0bf988d..a80190e 100644
--- a/js/step4_if_fn_do.js
+++ b/js/step4_if_fn_do.js
@@ -34,6 +34,7 @@ function eval_ast(ast, env) {
}
function _EVAL(ast, env) {
+ //printer.println("EVAL:", types._pr_str(ast, true));
if (!types._list_Q(ast)) {
return eval_ast(ast, env);
}
diff --git a/make/core.mk b/make/core.mk
index aaba3fd..fbea5ea 100644
--- a/make/core.mk
+++ b/make/core.mk
@@ -102,9 +102,11 @@ vals = $(foreach new_list,$(call _list),$(new_list)$(eval $(new_list)_value := $
# retrieve the value of a string key object from the hash map, or
# retrive a vector by number object index
get = $(strip \
- $(if $(call _hash_map?,$(word 1,$(1))),\
- $(call _get,$(word 1,$(1)),$(call str_decode,$($(word 2,$(1))_value))),\
- $(call _get,$(word 1,$(1)),$(call int_decode,$($(word 2,$(1))_value)))))
+ $(if $(call _nil?,$(word 1,$(1))),\
+ $(__nil),\
+ $(if $(call _hash_map?,$(word 1,$(1))),\
+ $(call _get,$(word 1,$(1)),$(call str_decode,$($(word 2,$(1))_value))),\
+ $(call _get,$(word 1,$(1)),$(call int_decode,$($(word 2,$(1))_value))))))
contains? = $(if $(call _contains?,$(word 1,$(1)),$(call str_decode,$($(word 2,$(1))_value))),$(__true),$(__false))
diff --git a/python/core.py b/python/core.py
index 5e2ef75..8b01b69 100644
--- a/python/core.py
+++ b/python/core.py
@@ -39,7 +39,7 @@ def dissoc(src_hm, *keys):
return hm
def get(hm, key):
- if key in hm:
+ if hm and key in hm:
return hm[key]
else:
return None
diff --git a/ruby/core.rb b/ruby/core.rb
index 212374a..8823112 100644
--- a/ruby/core.rb
+++ b/ruby/core.rb
@@ -27,7 +27,7 @@ $core_ns = {
:map? => lambda {|a| a.is_a? Hash},
:assoc => lambda {|*a| a[0].merge(Hash[a.drop(1).each_slice(2).to_a])},
:dissoc => lambda {|*a| h = a[0].clone; a.drop(1).each{|k| h.delete k}; h},
- :get => lambda {|a,b| a[b]},
+ :get => lambda {|a,b| return nil if a == nil; a[b]},
:contains? => lambda {|a,b| a.key? b},
:keys => lambda {|a| List.new a.keys},
:vals => lambda {|a| List.new a.values},