きっかけ: Ruby 1.8 では String クラスのメソッド split を空文字列に渡すと必ず空配列が返ります:
$ ruby --version
ruby 1.8.2 (2005-04-11) [i386-linux]
$ irb
irb(main):001:0> "".split("x")
=> []
irb(main):002:0> "".split(//)
=> []
irb(main):003:0>
この振る舞いが奇妙に思えたので、他の言語での対応する関数を調べてみました。
split(string, array [, fieldsep])String.prototype.split(separator, limit)split /PATTERN/,EXPR,LIMITsplit([sep [,maxsplit]])splitexplodepreg_splitsplit と同様の機能を提供する関数として strsep などがある。ただし delimiter に正規表現は使えない。String#split(String regex, int limit)split に相当する関数はない。split に相当する関数はない。split に相当する関数はない。(split-string STRING &optional SEPARATORS)split に相当する手続きはない。Gauche には独自の手続き string-split がある。それぞれで空文字列を分割したときの振る舞いは:
split は空配列を返すとドキュメンテーションされている: split - perldoc.perl.orgsplit は1つの空文字列のみからなる配列を返すとドキュメンテーションされている: Python Library Reference - 3.6.1 String Methodssplit は(limit が 0 でも)1つの空文字列のみからなる配列を返す。explode は delimiter が空文字列にマッチする場合には警告し false を返す。さもなくば1つの空文字列のみからなる配列を返す。preg_split は2つの空文字列からなる配列を返す場合がある:$ php --version
PHP 4.3.10-22 (cli) (built: Jun 30 2007 14:42:16)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
$ php -r '$x=preg_split("//", "");var_dump($x);'
array(2) {
  [0]=>
  string(0) ""
  [1]=>
  string(0) ""
}
split-string は空リストを返す:(emacs-version)
=> "GNU Emacs 21.4.1 (i386-pc-linux-gnu)
 of 2005-03-18 on trouble, modified by Debian"
(split-string "" "")
=> nil
string-split は splitter が空文字列にマッチする場合にはエラーとなり、さもなければ1つの空文字列のみからなるリストを返す:gosh> (gauche-version)
"0.8.10"
gosh> (string-split "" "")
*** ERROR: string-split: splitter must not match a null string: ""
Stack Trace:
_______________________________________
  0  (error "string-split: splitter must not match a null string:" spli ...
        At line 57 of "/usr/local/share/gauche/0.8.10/lib/gauche/stringutil.scm"
  1  (%string-split-scanner splitter)
        At line 50 of "/usr/local/share/gauche/0.8.10/lib/gauche/stringutil.scm"
gosh> (string-split "" #/x/)
("")
gosh>
参考