go: add seq and string?
authorDov Murik <dov.murik@gmail.com>
Fri, 12 Feb 2016 05:10:32 +0000 (00:10 -0500)
committerDov Murik <dov.murik@gmail.com>
Fri, 12 Feb 2016 15:16:04 +0000 (10:16 -0500)
Issue #166

go/src/core/core.go

index c9701cc..e6e6c0c 100644 (file)
@@ -4,6 +4,7 @@ import (
        "errors"
        "fmt"
        "io/ioutil"
        "errors"
        "fmt"
        "io/ioutil"
+       "strings"
        "time"
 )
 
        "time"
 )
 
@@ -323,6 +324,34 @@ func conj(a []MalType) (MalType, error) {
        return new_hm, nil
 }
 
        return new_hm, nil
 }
 
+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")
+}
+
 // Metadata functions
 func with_meta(a []MalType) (MalType, error) {
        if len(a) != 2 {
 // Metadata functions
 func with_meta(a []MalType) (MalType, error) {
        if len(a) != 2 {
@@ -422,12 +451,15 @@ var NS = map[string]MalType{
        "symbol?": func(a []MalType) (MalType, error) {
                return Symbol_Q(a[0]), nil
        },
        "symbol?": func(a []MalType) (MalType, error) {
                return Symbol_Q(a[0]), nil
        },
+       "string?": func(a []MalType) (MalType, error) {
+               return (String_Q(a[0]) && !Keyword_Q(a[0])), nil
+       },
        "keyword": func(a []MalType) (MalType, error) {
        "keyword": func(a []MalType) (MalType, error) {
-                if Keyword_Q(a[0]) {
-                    return a[0], nil
-                } else {
-                    return NewKeyword(a[0].(string))
-                }
+               if Keyword_Q(a[0]) {
+                       return a[0], nil
+               } else {
+                       return NewKeyword(a[0].(string))
+               }
        },
        "keyword?": func(a []MalType) (MalType, error) {
                return Keyword_Q(a[0]), nil
        },
        "keyword?": func(a []MalType) (MalType, error) {
                return Keyword_Q(a[0]), nil
@@ -511,6 +543,7 @@ var NS = map[string]MalType{
        "apply":  apply,
        "map":    do_map,
        "conj":   conj,
        "apply":  apply,
        "map":    do_map,
        "conj":   conj,
+       "seq":    seq,
 
        "with-meta": with_meta,
        "meta":      meta,
 
        "with-meta": with_meta,
        "meta":      meta,