       (: (Fn Char String String))
       (Js.binary "+" what to)))
 
+  Set (class [set item]
+    elem? (fn [what in]
+      (: (Fn item set Bool))
+      (# Whether in contains what .)))
+
+  set-set (instance (Set (Set a) a)
+    elem? (macro [what in]
+      (: (Fn (Set a) a Bool))
+      (Js.method in "contains" {what})))
+
   my-split (fn [separators text]
     (fold-right distinguish ["" {""}] text)
     distinguish (fn [letter done]
-      (if True
+      (if (elem? letter separators)
         [(& letter seps-in-order) (& "" words)]
         [seps-in-order (& (& letter first-word) rest-words)])
       {first-word ..rest-words} words
       [seps-in-order words] done))
 
-  separators ".,:;! "
+  separators (Set \\space \\, \\!)
 
   [seps words] (my-split separators "Hello, world!")
   """

      # log "compiling", body
      if body
        compiledBody = termCompile ctx, body
      # log "compiled", body.tea
      ctx.closeScope()


      if _notEmpty retainedConstraints
        ctx.extendSubstitution substituionFail "#{name}'s context is too weak, missing #{listOf (map printType, retainedConstraints)}"
  else
    # log name, "constraints", (substituteList ctx.substitution, constraints)
    [deferredConstraints, retainedConstraints] = deferConstraints ctx,
      (substituteList ctx.substitution, constraints)
    # Finalizing type again after possibly added substitution when defer constraints
