From 1771ab50b87c745181e4e30f94b63e3f23d33dac Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Thu, 9 Oct 2014 22:10:15 -0500 Subject: go: update README. Backport Func usage. --- go/src/types/types.go | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'go/src/types') diff --git a/go/src/types/types.go b/go/src/types/types.go index 616c8c7..613bfb5 100644 --- a/go/src/types/types.go +++ b/go/src/types/types.go @@ -65,6 +65,16 @@ func String_Q(obj MalType) bool { // Functions +type Func struct { + Fn func([]MalType) (MalType, error) + Meta MalType +} + +func Func_Q(obj MalType) bool { + if obj == nil { return false } + return reflect.TypeOf(obj).Name() == "Func" +} + type MalFunc struct { Eval func(MalType, EnvType) (MalType, error) Exp MalType @@ -97,6 +107,8 @@ func Apply(f_mt MalType, a []MalType) (MalType, error) { env, e := f.GenEnv(f.Env, f.Params, List{a,nil}) if e != nil { return nil, e } return f.Eval(f.Exp, env) + case Func: + return f.Fn(a) case func([]MalType)(MalType, error): return f(a) default: @@ -206,18 +218,25 @@ func Equal_Q(a MalType, b MalType) bool { } //av := reflect.ValueOf(a); bv := reflect.ValueOf(b) //fmt.Printf("here2: %#v\n", reflect.TypeOf(a).Name()) - switch reflect.TypeOf(a).Name() { - case "Symbol": + //switch reflect.TypeOf(a).Name() { + switch a.(type) { + case Symbol: return a.(Symbol).Val == b.(Symbol).Val - case "List": fallthrough - case "Vector": + case List: + as,_ := GetSlice(a); bs,_ := GetSlice(b) + if len(as) != len(bs) { return false } + for i := 0; i < len(as); i+=1 { + if !Equal_Q(as[i], bs[i]) { return false } + } + return true + case Vector: as,_ := GetSlice(a); bs,_ := GetSlice(b) if len(as) != len(bs) { return false } for i := 0; i < len(as); i+=1 { if !Equal_Q(as[i], bs[i]) { return false } } return true - case "HashMap": + case HashMap: return false default: return a == b -- cgit v1.2.3