aboutsummaryrefslogtreecommitdiff
path: root/go/src/types
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-10-09 22:10:15 -0500
committerJoel Martin <github@martintribe.org>2015-01-06 21:57:02 -0600
commit1771ab50b87c745181e4e30f94b63e3f23d33dac (patch)
treec1c9b5d80ba9261c5f16bab1b52c1bb0f559407c /go/src/types
parentf2544a9467ea032aff505b3ced3b4b3510a828fe (diff)
downloadmal-1771ab50b87c745181e4e30f94b63e3f23d33dac.tar.gz
mal-1771ab50b87c745181e4e30f94b63e3f23d33dac.zip
go: update README. Backport Func usage.
Diffstat (limited to 'go/src/types')
-rw-r--r--go/src/types/types.go29
1 files changed, 24 insertions, 5 deletions
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