CSVつづき

デリミタをカンマ以外にも指定できるようにしてみた。

splitw(XS, Delimiter)->
    RRS = splitw(XS,,, Delimiter),
    RS = lists:map(fun lists:reverse/1, RRS),
    lists:reverse(RS).

splitw([Delimiter |XS], Cur, All, Delimiter) ->
    splitw(XS, , [Cur|All], Delimiter);
splitw([X|XS], Cur, All, Delimiter) ->
    splitw(XS, [X|Cur], All, Delimiter);
splitw(,Cur,All, _Delimiter) ->
    [Cur|All].
(emacs@pokarim)19> csv:splitw("abc,def,123",$,).
["abc","def","123"]

splitw([Delimiter |XS], Cur, All, Delimiter) ->
のところのパターンマッチングの仕方がすこしおもしろい感じになった。
Pythonにはない感覚。というか、Haskellでもこれは通らないか?
念のため試してみる。

main = print $ f (2, 2)
f (x, y) = 1

これはとおるけど、

main = print $ f (2, 2)
f (x, x) = 1

これはコンパイル時に、

    Conflicting definitions for `x'
    In the definition of `f'

といってエラーとなる。そりゃそうだな。
以前ここらへんを調べたけど、
2008-03-19 - Conceptual Contexture
もっと簡単な例があったと。