diff options
| author | Joel Martin <github@martintribe.org> | 2014-04-15 01:24:43 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-04-15 01:24:43 -0500 |
| commit | 7e9a2883fe5c25a521b1dc37e4c549e1ed508ece (patch) | |
| tree | b444224dae6db978d4b5902f2a5b37046ba40d3e | |
| parent | a2849f89e7892feee256169398b1d2d82a2b8231 (diff) | |
| download | mal-7e9a2883fe5c25a521b1dc37e4c549e1ed508ece.tar.gz mal-7e9a2883fe5c25a521b1dc37e4c549e1ed508ece.zip | |
All: fix get. All pass stepA tests.
| -rw-r--r-- | bash/core.sh | 4 | ||||
| -rw-r--r-- | c/core.c | 2 | ||||
| -rw-r--r-- | cs/core.cs | 8 | ||||
| -rw-r--r-- | java/src/main/java/mal/core.java | 16 | ||||
| -rw-r--r-- | java/src/main/java/mal/step6_file.java | 2 | ||||
| -rw-r--r-- | java/src/main/java/mal/step7_quote.java | 2 | ||||
| -rw-r--r-- | js/core.js | 2 | ||||
| -rw-r--r-- | js/step2_eval.js | 1 | ||||
| -rw-r--r-- | js/step3_env.js | 1 | ||||
| -rw-r--r-- | js/step4_if_fn_do.js | 1 | ||||
| -rw-r--r-- | make/core.mk | 8 | ||||
| -rw-r--r-- | python/core.py | 2 | ||||
| -rw-r--r-- | ruby/core.rb | 2 |
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 () { @@ -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); } @@ -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() { @@ -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}, |
