読者です 読者をやめる 読者になる 読者になる

Scalaオフ会&勉強会@豆蔵に行ってきた

一昨日の話だけど.

感想とか

改めて言語組み込みパターンマッチが強力な言語は良いなぁ,とかおもた.特に型システムとの連携.
あと,正規表現なんかもまさに広義のパターンマッチの一種だけど,そういった「パターンマッチ的なもの」の整理・統合は今後の全部入り言語の標準機能としてじわじわ来そうな気がする.じわじわ.

String と同じメソッド群を持ち同じように振る舞うならそれは String である…っていうと Duck Typing になっちゃうか、えーとえーと、「Regexp が要求するあれとこれとそのメソッドを持ってれば全て正規表現検索対象にできます」っていうのが Structural Typing 的な考え方であって、"String" っていう"特定の"クラスだけを検索対象にできます、っていうのは Nominal Typing 的な考え方だと思います。そしてもちろん、C++のregex は前者です。果ては Xpressive みたいな、正規表現を文字列以外の方法で記述できる実装だと、「文字」の「列」ですらなくても「文字とおなじようにふるまうもの」の「列」に対して正規表現使えちゃったりとか。intの配列から、100未満の値が繰り返されてる部分を取り出し!

要は、正規表現中のグループを取り出すことが出来る。

グループが複数の場合はこんな感じ。

val ptn1 = "([0-9]+).*".r
val ptn2 = "([^0-9]+)([0-9]+).*".r
val ptn3 = "[^0-9]*([0-9]+)([^0-9]+)([0-9]+).*".r

val strs = List("hoge", "hoge123", "456piyo", "hoge789piyo", "hoge123piyo456HOGE")

strs.foreach {
  case ptn3(x,y,z) => println("3:[" + x + "," + z +"],[" + y + "]")
  case ptn2(x,y) => println("2:[" + x + "],[" + y + "]")
  case ptn1(x)   => println("1:[" + x + "]")
  case x         => println("not found..." + x)
}

結果は・・・

not found...hoge
2:[hoge],[123]
1:[456]
2:[hoge],[789]
3:[123,456],[piyo]

便利!

あと,

パターンマッチングとかよくわかってないけど、すごいことはよくわかった

11:01 PM June 13, 2008 from web : Faith and Brave

とか見ていると,古き良き awk なんかが当たり前にやっていたプログラミングスタイルがロストテクノロジー化しちゃってて,今時の言語を通じて再発見されてるのかという気も.というか,日々長ったらしいシェルスクリプトを書き散らかしている自分も再発見組だなぁ.3 日後ぐらいに全く関係ない F# とか Scala とかのコードを読みながら,「ああそういえば,あれ gawk で短く書けたなぁ」と気付くことが多い.
とまあ,偉い人に「それ gawk で」とかがんがんやって頂けると,それが新鮮さをもって受け入れられそうな面白い状況に見える今日この頃.某雑記帖方面の人とかに期待.

変更履歴