パターンマッチング:illegal patternですか
うーん、++という演算子が、配列に対するものだという理解を深めていけば、理由はわかるようになるんだろうか。
14> Aho = fun("abc" ++ TT) -> TT end . #Fun15> Aho("abcE"). "E" 16> Kue = fun("abc" ++ YY ++ "k") -> YY end. ** 1: illegal pattern ** 17> Kue = fun(YY ++ "abc") -> YY end . ** 1: illegal pattern ** 18> Kue = fun("def" ++ YY) -> YY end. #Fun 19> Kue("choko"). =ERROR REPORT==== 17-Jun-2008::03:19:43 === Error in process <0.74.0> with exit value: {function_clause,[{erl_eval,'-inside-a-shell-fun-',["choko"]},{erl_eval,expr,3}]} ** exited: {function_clause,[{erl_eval,'-inside-a-shell-fun-',["choko"]}, {erl_eval,expr,3}]} ** 20> Kue("defchoko"). "choko" 21> Kue("def choko"). " choko" 22>
とりあえず、引数のパターンマッチングにあまり期待するのはやめよう>自分。
さりとて、RubyやPerlで使われている正規表現ライブラリをくっつけるのは気が進まない。並列動作時のボトルネックにならないか心配なのだ(テストしてみろ>自分)
というわけで、ちまちまとmatchとかskip_spaceなどを書いてみている。
match (, T) -> {true, T};
match (S, ) -> {false, S};
match ([HS|TS], [HT|TT]) ->
case HS =:= HT of
true -> match(TS, TT);
false -> {false, [HS|TS]}
end.
skip_space([32|L]) -> skip_space(L);
skip_space(_Any) -> _Any.
これをfun()を使って変数に代入して、mapしたりconcatenateしたりできんものかと、、、こういうのは、他の関数型言語の正規表現の使い方をまず勉強すべきだな。