From f2c9811fd8cbb205fad68952ebc1ba5d310f148d Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Thu, 9 Oct 2014 19:14:43 -0500 Subject: go: add hash-map support. --- go/src/types/types.go | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'go/src/types') diff --git a/go/src/types/types.go b/go/src/types/types.go index a489aa3..03269f5 100644 --- a/go/src/types/types.go +++ b/go/src/types/types.go @@ -62,6 +62,15 @@ func Symbol_Q(obj MalType) bool { } +// Strings +func String_Q(obj MalType) bool { + switch obj.(type) { + case string: return true + default: return false + } +} + + // Functions type MalFunc struct { Eval func(MalType, EnvType) (MalType, error) @@ -141,7 +150,24 @@ func GetSlice(seq MalType) ([]MalType, error) { } // Hash Maps -func Hash_Map_Q(obj MalType) bool { +func NewHashMap(seq MalType) (MalType, error) { + lst, e := GetSlice(seq) + if e != nil { return nil, e } + if len(lst) % 2 == 1 { + return nil, errors.New("Odd number of arguments to NewHashMap") + } + m := map[string]MalType{} + for i := 0; i < len(lst); i+=2 { + str, ok := lst[i].(string) + if !ok { + return nil, errors.New("expected hash-map key string") + } + m[str] = lst[i+1] + } + return m, nil +} + +func HashMap_Q(obj MalType) bool { switch obj.(type) { case map[string]MalType: return true default: return false -- cgit v1.2.3