+func seq(a []MalType) (MalType, error) {
+ if a[0] == nil {
+ return nil, nil
+ }
+ switch arg := a[0].(type) {
+ case List:
+ if len(arg.Val) == 0 {
+ return nil, nil
+ }
+ return arg, nil
+ case Vector:
+ if len(arg.Val) == 0 {
+ return nil, nil
+ }
+ return List{arg.Val, nil}, nil
+ case string:
+ if len(arg) == 0 {
+ return nil, nil
+ }
+ new_slc := []MalType{}
+ for _, ch := range strings.Split(arg, "") {
+ new_slc = append(new_slc, ch)
+ }
+ return List{new_slc, nil}, nil
+ }
+ return nil, errors.New("seq requires string or list or vector or nil")
+}
+