Yeah, right - we can't do a semantic check in all cases.

If it most often will be, we could still check in the case that we know is a string. ie.

```
  def checkPattern(invocation: ast.FunctionInvocation): SemanticCheck = invocation.arguments(1) match {
    case pattern: StringLiteral =>
      when (pattern.value.length == 0) {
        SemanticError("Invalid split pattern (cannot be empty)", invocation.position)
      }
    case _ => SemanticCheckResult.success
  }
```

If it's worth it.