« 【Perl関西】Perlベストプラクティス~プログラミング作法は何故必要か? | トップページ | 【告知】Ruby on Rails について~JavaからRubyへ »

2007/06/16

【Ruby関西】RubyプログラムからJavaの匂いを消したい

 第16回 Ruby関西に行ってきた。
 Ruby会議2007の話もあり、牛尾さんも来られて、いつもの如く盛り上がった。
 楽しかったことをメモ。

【1】Continuation(継続)ライブラリは恐ろしい~yharaさんの話

 Continuation(継続)は、C 言語の setjmp()/longjmp() に相当するRubyのライブラリのこと。
 定義は下記に書かれている。

組み込み関数 callcc

 何故こんなライブラリが必要なのか?
 理由は、込み入ったループ処理でジャンプしたい時、イベント処理で複雑にwaitしている時にジャンプしたい時があるから。

 普通は、使わなくても書けるし、多分書かない方がいい。
 yharaさんが機能を解説してくれたが、callccが入ると、セーブポイントへジャンプするため、同じようなステートメントを何度も通過するので、机上デバッグできない。

 でも、こんな問題でcallccを使うと綺麗に解ける。(元々はSCIP本にあるらしい)

Baker, Cooper, Fletcher, MillerとSmithは五階建てアパートの異なる階に住んでいる。
Bakerは最上階に住むのではない。
Cooperは最下階に住むのではない。
Fletcherは最上階にも最下階にも住むのではない。
MillerはCooperより上の階に住んでいる。
SmithはFletcherの隣の階に住むのではない。
FletcherはCooperの隣の階に住むのではない。
それぞれはどの階に住んでいるか。

Rubyで書くとこうなる。

[Haskell] 非決定性計算

require "amb"

A = Amb.new

baker = A.choose(1, 2, 3, 4, 5)
cooper = A.choose(1, 2, 3, 4, 5)
fletcher = A.choose(1, 2, 3, 4, 5)
miller = A.choose(1, 2, 3, 4, 5)
smith = A.choose(1, 2, 3, 4, 5)

A.assert([baker, cooper, fletcher, miller, smith].uniq.length == 5)
A.assert(baker != 5)
A.assert(cooper != 1)
A.assert(fletcher != 1 && fletcher != 5)
A.assert(miller > cooper)
A.assert((smith - fletcher).abs != 1)
A.assert((fletcher - cooper).abs != 1)

p [baker, cooper, fletcher, miller, smith]

 amb.choose()にはcallccが使われているとのこと。
 Howではなくwhatを書くだけで解けてしまっている。
 うーん、すごすぎ。

 ちなみにHaskellではこう書けるらしい。

リストモナドで非決定性計算

import Control.Monad.List

solve = do baker <- [1, 2, 3, 4, 5]
cooper <- [1, 2, 3, 4, 5]
fletcher <- [1, 2, 3, 4, 5]
miller <- [1, 2, 3, 4, 5]
smith <- [1, 2, 3, 4, 5]
guard $ distinct [baker, cooper, fletcher, miller, smith]
guard $ baker /= 5
guard $ cooper /= 1
guard $ fletcher /= 1 && fletcher /= 5
guard $ miller > cooper
guard $ abs (smith - fletcher) /= 1
guard $ abs (fletcher - cooper) /= 1
[baker, cooper, fletcher, miller, smith]

distinct :: Eq a => [a] -> Bool
distinct [] = True
distinct (x:xs) = all (/=x) xs && distinct xs

main :: IO()
main = print solve

(解答)[3,2,4,5,1]

【2】自分が書いたRubyプログラムからJavaの匂いを消したい~(余談)牛尾さんの話

 牛尾さんが来られていたので、ちょっとだけ話が出来た。
 今はJavaよりもRubyにはまっているとのこと。
 型を書くのが面倒になってきた、RailsのActiveRecordはJavaのDAOと比較にならないほど使いやすい、と言っていた。
 
 懇親会で、牛尾さんが自作のRubyプログラムをRuby関西のRubyistに添削してもらっていた\(^o^)/
 Rubyistに話を聞いたら、牛尾さんのプログラムはクラス継承もあって設計がすごくキッチリしている。
 でも、Javaの人が書いたとすぐに分かるプログラムで、RubyならIF文の羅列やbooleanメソッドなどはもっと短く書けるよ、とのこと。

 牛尾さんに後で話を聞いたら、プログラムからJavaの匂いを消したいんですよ、Rubyを体に染み込ませるまで書き込みたい、とのこと。
 モデリングのプロである彼がそこまではまっているとは思ってもみなかった。
 eXtreme Programming以来の衝撃がRubyにあるんですよ、と言う彼の言葉が印象的だった。

 うじひささんが、牛尾さんのことをアジャイル王子(XP祭り関西2006のライブセッションの王子役)と言っていたのも印象に残った。
 XP祭り関西を未だに思い出として残している人たちがいる。

 とまあ、技術の話も懇親会も楽しかった。


|

« 【Perl関西】Perlベストプラクティス~プログラミング作法は何故必要か? | トップページ | 【告知】Ruby on Rails について~JavaからRubyへ »

コミュニティ」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: 【Ruby関西】RubyプログラムからJavaの匂いを消したい:

« 【Perl関西】Perlベストプラクティス~プログラミング作法は何故必要か? | トップページ | 【告知】Ruby on Rails について~JavaからRubyへ »