【Ruby関西】RubyプログラムからJavaの匂いを消したい
第16回 Ruby関西に行ってきた。
Ruby会議2007の話もあり、牛尾さんも来られて、いつもの如く盛り上がった。
楽しかったことをメモ。
【1】Continuation(継続)ライブラリは恐ろしい~yharaさんの話
Continuation(継続)は、C 言語の setjmp()/longjmp() に相当するRubyのライブラリのこと。
定義は下記に書かれている。
何故こんなライブラリが必要なのか?
理由は、込み入ったループ処理でジャンプしたい時、イベント処理で複雑にwaitしている時にジャンプしたい時があるから。
普通は、使わなくても書けるし、多分書かない方がいい。
yharaさんが機能を解説してくれたが、callccが入ると、セーブポイントへジャンプするため、同じようなステートメントを何度も通過するので、机上デバッグできない。
でも、こんな問題でcallccを使うと綺麗に解ける。(元々はSCIP本にあるらしい)
Baker, Cooper, Fletcher, MillerとSmithは五階建てアパートの異なる階に住んでいる。
Bakerは最上階に住むのではない。
Cooperは最下階に住むのではない。
Fletcherは最上階にも最下階にも住むのではない。
MillerはCooperより上の階に住んでいる。
SmithはFletcherの隣の階に住むのではない。
FletcherはCooperの隣の階に住むのではない。
それぞれはどの階に住んでいるか。
Rubyで書くとこうなる。
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祭り関西を未だに思い出として残している人たちがいる。
とまあ、技術の話も懇親会も楽しかった。
| 固定リンク
「コミュニティ」カテゴリの記事
- 第26回redmine.tokyo勉強会の感想~多様性はコミュニティが成功する重要な要因の一つ #redmineT(2024.06.15)
- 『世界一流エンジニアの思考法』が学べる環境を手に入れてかつ継続する方法の感想 #devboost(2023.12.10)
- 第25回東京Redmine勉強会の感想 #redminet(2023.11.05)
- パターンカタログよりもモンスターカタログの方が面白いね #jasstkansai(2023.06.24)
- デブサミ2023の感想(2023.02.11)
コメント