diff options
Diffstat (limited to 'go/src/core/core.go')
| -rw-r--r-- | go/src/core/core.go | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/go/src/core/core.go b/go/src/core/core.go index 65475bb..3c6693e 100644 --- a/go/src/core/core.go +++ b/go/src/core/core.go @@ -50,12 +50,35 @@ func cons(a []MalType) (MalType, error) { } func concat(a []MalType) (MalType, error) { - lst1, e := GetSlice(a[0]); if e != nil { return nil, e } - lst2, e := GetSlice(a[1]); if e != nil { return nil, e } + if len(a) == 0 { return List{}, nil } + slc1, e := GetSlice(a[0]); if e != nil { return nil, e } + for i := 1; i < len(a); i+=1 { + slc2, e := GetSlice(a[i]); if e != nil { return nil, e } + slc1 = append(slc1, slc2...) + } + return List{slc1}, nil +} + +func nth(a []MalType) (MalType, error) { + slc, e := GetSlice(a[0]); if e != nil { return nil, e } + idx := a[1].(int) + return slc[idx], nil +} - return List{append(lst1, lst2...)}, nil +func first(a []MalType) (MalType, error) { + if len(a) == 0 { return nil, nil } + slc, e := GetSlice(a[0]); if e != nil { return nil, e } + if len(slc) == 0 { return nil, nil } + return slc[0], nil } +func rest(a []MalType) (MalType, error) { + slc, e := GetSlice(a[0]); if e != nil { return nil, e } + if len(slc) == 0 { return List{}, nil } + return List{slc[1:]}, nil +} + + func empty_Q(a []MalType) (MalType, error) { switch obj := a[0].(type) { case List: return len(obj.Val) == 0, nil @@ -112,6 +135,9 @@ var NS = map[string]MalType{ "cons": cons, "concat": concat, + "nth": nth, + "first": first, + "rest": rest, "empty?": empty_Q, "count": count, } |
