タグ

ブックマーク / deve68.hatenadiary.org (17)

  • Programming Grails - コードの恵み

    O'Reilly では Open Feedback Publishing System といって執筆中の書籍にコメントできるらしい(ただし English)。 Online Feedback Publishing System - O'Reilly Media というわけで Grailsが出るみたい(まだ半分も書かれていない)。 Online Feedback Publishing System - O'Reilly Media Stack Overflow を見ていると Groovy タグに結構な割合で Grails が混じっているので海外では人気なのかな? 基的にスクリプトしか書かないので関係ないような気もするけどスクリプトからも使えるっぽい。

    Programming Grails - コードの恵み
  • 最長重複文字列問題 in Clojure - コードの恵み

    Clojure を学ぶ Groovy と ScalaJava文化圏から生まれたものだが、Clojure は Lisp の文化圏から Java に入ってきたものだ。 関数の呼び出しが (関数名 引数1 引数2 ...) と前置記法で書いたリストであるところは Lisp だが、他の Lisp 系言語に比べると Groovy よりである。 今回は関数プログラミングのスタイルなので無名関数の書き方から Groovy と比較してみる 無名関数の書き方 Groovy Clojure { x -> 2 * x } (fn [x] (* 2 x)) { x -> 2 * x } #(* 2 %) { 2 * it } #(* 2 %) { x, y -> x + y } (fn [x y] (+ x y)) { x, y -> x + y } #(+ %1 %2) { it[0] + it[1]

    最長重複文字列問題 in Clojure - コードの恵み
    fumokmm
    fumokmm 2012/05/16
    なるほど、Clojure は Groovy 寄りだったのか。
  • 実装時の型と評価後の型 - コードの恵み

    前回の木構造と同じようにリストを表現するとどうなるのか? def tree = { [:].withDefault{ owner.call() } } def list = { h, t -> [h, { t?.call() }] } ちょっと意味が違う気がするけど気持ちの問題の範囲なので続ける。 h は先頭の要素で、t は評価すると残りのリストを返し、list は遅延評価されるリストになる。 def ones = list(1){ list(1){ owner.call() } } assert 1 == ones[0] assert 1 == ones[1]()[0] assert 1 == ones[1]()[1]()[0] assert 1 == ones[1]()[1]()[1]()[0] assert 1 == ones[1]()[1]()[1]()[1]()[0] 今回は使う

    実装時の型と評価後の型 - コードの恵み
  • なぜメモ化も重要か - コードの恵み

    1年前ぐらいに読んでよくわからなかったけど、ようやく理解できた気がしたので書いてみる。 なぜ関数プログラミングは重要か *1 John Hughes 氏の主張 プログラムをモジュール化するには関数プログラミングのスタイルで書くといいよ。 高階関数を使うと捗る 無限を使うと捗る 20年以上前に書かれたものだが今でもこの主張は通るし Groovy でも通る。 高階関数を使う // 基的な関数と inject を組み合わせて処理を行う def add(x,y) { x + y } def mul(x,y) { x * y } assert [*1..10].inject(0, this.&add) == 55 assert [*1..10].inject(1, this.&mul) == 3628800 // 組み合わせた処理は新しい処理として定義できる def sum (list) { li

    なぜメモ化も重要か - コードの恵み
  • metaClass - コードの恵み

    以前 uehaj 氏が指摘されたエントリ ExpandoMetaClass.enableGlobally()について一言いっておくか - uehaj's blog ExpandoMetaClass.enableGlobally() で metaClass が変化するのは同じだけど振る舞いは変わっているようなのでメモしておく。 この辺りは明文化されていないのでこれからも変わるかもしれない assert のコメントが付いているものは 1.7 と 1.8 で振る舞いが違ったもの 当は TCO をやりたかっただけなのでメソッドの追加ではなく更新系 思いつくままに調べた デフォルト引数と書いているがそれが影響しているのかはわからない ソースは追ってない // ExpandoMetaClass.enableGlobally() 影響なし class HasMethod { def num() { 1

    metaClass - コードの恵み
    fumokmm
    fumokmm 2011/06/03
    あとで読む
  • Closure.DONE - コードの恵み

    Closure は便利だけれども Groovy の場合は途中で break や return *1ができない。 値を返す必要がないときは each より for を使っているが内部イテレータが必要な場合は先に findAll でフィルタリングしている。 でも Groovy も一部のメソッドは break のようなことができるみたいだ。 directive というプロパティに Closure.DONE を設定すれば、その Closure のループから抜けることができる。 assert [1,2,3] == (1..10).collect { if (it >= 3) directive = Closure.DONE it } src を検索した限り collect, collectAll, times で使える findAll と比較すると最後の要素を拾ってしまうが break する分速い

    Closure.DONE - コードの恵み
    fumokmm
    fumokmm 2011/06/01
    これは知らなかった。
  • Groovy MOP - コードの恵み

    Groovy にはメタプログラミングための API が用意されている。*1 関数の自動メモ化 の中で当てはめると Spring AOP のようなことを言語内で行える。 class MemoizeInterceptor implements Interceptor { def cache = [:] def hasResult @Override Object beforeInvoke(Object object, String methodName, Object[] arguments) { this.hasResult = cache.containsKey([methodName, *arguments]) } @Override Object afterInvoke(Object object, String methodName, Object[] arguments, Obje

    Groovy MOP - コードの恵み
  • Happy number - コードの恵み

    Happy numbers - Rosetta Code から Happy number とは次のようなものらしい。 その数の各桁の平方和が 1 になれば Happy ならない場合は再帰して調べる 各桁の平方和が 4 になると循環するので Happy ではない 例) 79 は 49+81=130 -> 1+9+0=10 -> 1 なので Happy Groovy のコードはなかったので Haskell だけ引用 Haskell import Data.Char (digitToInt) import Data.Set (member, insert, empty) isHappy :: Integer -> Bool isHappy = p empty where p _ 1 = True p s n | n `member` s = False | otherwise = p (inse

    Happy number - コードの恵み
    fumokmm
    fumokmm 2011/04/21
    なるほど。
  • groovy.util.MapEntry - コードの恵み

    Hash from two arrays - Rosetta Code から Groovy keys = ['a','b','c'] vals = ['aaa', 'bbb', 'ccc'] hash = [:] keys.eachWithIndex { key, i -> hash[key] = vals[i] } Haskell import Data.Map makeMap ks vs = fromList $ zip ks vs mymap = makeMap ['a','b','c'] [1,2,3] Groovy は変数を使っているので、Haskell のやり方を Groovy で実装することにする。 Java では Map.Entry は public だが各 Map の Entry の実装クラスは public ではない。 Groovy では Map に entry のみを

    groovy.util.MapEntry - コードの恵み
  • Fibonacci number - コードの恵み

    以前、AST変換でバイトコードを直接生成して計算する方法で Pure Java より速いことが話題に上がっていた。*1 http://www.jroller.com/melix/entry/yes_fibonacci_in_groovy_can 速いぞGroovy! - uehaj's blog Pure Java より速いぞ Groovy! - 倭マン's BLOG Groovy1.8 ではバイトコードにまでする意味がなくなるのではと指摘されていたようにプリミティブ型の演算が速くなっていたのでその結果から見ていく。*2 Pure Groovy 165580141 Computed in 1864ms Bytecode Groovy 165580141 Computed in 735ms Groovy のサイトには載っていないのだがヘルプを見るとコマンドラインオプションが増えていてプリミテ

    Fibonacci number - コードの恵み
  • 『今流行のお題を出してみた』に Groovy で挑戦 - コードの恵み

    お題:はてなブログに移行しました 問題をみて「グラフが強連結であること」ってところまでは調べたんだが 強連結であることを判定するアルゴリズムはあっても強連結なグラフを作るものがみあたらない。 何回かグラフ関連のアルゴリズムをあさっていたら気がついた。 ある点から全域木を2回張って一方は葉へもう一方は根へ移動すれば全ての点からある点を経由してどの点にも移動できる。 全域木は最小である必要はないが一方を最小、一方を最大*1とした。 グラフのアルゴリズムは実装しても*2よかったがライブラリの解説ページがあったのでそれを使用することにした。 JUNG2.0 Tutorial いくつか自分の中でも未解決なことがあるので間違っているかも知れない。 サンプルを参考に実装してみただけなので意味がわかっていない箇所がある*3 ランダムに重みをつけて最小全域木を求めると辺の数が 99 になるのだがこれは固定な

    『今流行のお題を出してみた』に Groovy で挑戦 - コードの恵み
    fumokmm
    fumokmm 2011/04/12
    あとでチェック。memoizeとか。
  • Groovy の in キーワード - コードの恵み

    groovy.time パッケージを調べていたら知らない in の使い方をしていた。 http://groovy.codehaus.org/JN0545-Dates System.setProperty('user.timezone', 'GMT') def c= new GregorianCalendar( 2002, Calendar.JUNE, 30 ) assert c.lenient c.set( Calendar.DATE, 31 ); c.time assert String.format('%tF %<ta', c) == '2002-07-01 Mon' c= new GregorianCalendar( 2002, Calendar.JUNE, 30 ) c.lenient= false c.set( Calendar.DATE, 31 ) try{ c.time; a

    Groovy の in キーワード - コードの恵み
    fumokmm
    fumokmm 2011/04/11
    Groovyのin
  • Groovy でリストのかけ算 - コードの恵み

    元ネタ: http://d.hatena.ne.jp/atsuoishimoto/20110409/1302347562 Groovy でも同様で*1 groovy:000> a = [[]] * 5 ===> [[], [], [], [], []] groovy:000> a.head() << 'A' ===> [A] groovy:000> a ===> [[A], [A], [A], [A], [A]] 別のインスタンスにしたかったらこんなやり方もある。 groovy:000> a = ([{ [] }]*5)*.call() ===> [[], [], [], [], []] groovy:000> a.head() << 'A' ===> [A] groovy:000> a ===> [[A], [], [], [], []] これ考えたのは『Scala スケーラブルプログラ

    Groovy でリストのかけ算 - コードの恵み
    fumokmm
    fumokmm 2011/04/11
    ([{ [] }]*5)*.call()の動きを理解。(0..<5).collect{ [] } が読みやすいかもしれない。
  • コードの恵み

    今年も半分が終わろうとしているが1月の TODO を解決する。 404 Blog Not Found:Algorithm - Suffix Array を JavaScript で再発明してみた Suffix Array ではなく BWT の方を。 Groovy で実装してみる 参考 http://homepage3.nifty.com/DO/blocksorting.htm BlockSorting - 西尾泰和のはてなダイアリー 続・BlockSorting(BWT) - 西尾泰和のはてなダイアリー BlockSorting を Squeak Smalltalk で - Smalltalkのtは小文字です Ruby 版をそのまま Groovy へ def encode(src) { int n = src.size() def srcsrc = src + src def vars =

    コードの恵み
  • Groovy の getAt - コードの恵み

    Groovy では演算子の多重定義によって a[b] は a.getAt(b) の呼び出しに置き換えられる。 a, b のクラスは自由なので、次のようなこともできる。 class Greeting { def text } class Say { def getAt(Greeting greeting) { println greeting.text } } new Say()[new Greeting(text: "hello")] 標準で getAt を実装しているクラスには、配列、String、Map、List、Object、Matcher、Date などがある。 それぞれに対応した b が存在する。 Range を指定できる場合は Collection も指定できるように多重定義されているので次のようなことができる。 [1,2,3,4,5][0..1,2,3..4] // [1,2

    Groovy の getAt - コードの恵み
    fumokmm
    fumokmm 2011/03/11
    getAtの話。getAtの引数にはクラスも使えたのか、これは便利そう。でも言われてみればクラスが使えるのも当然か。
  • Groovy の Range - コードの恵み

    s = "abc" assert "abc" == s[0..<s.size()] assert "abc" == s[0..-1] assert "ab" == s[0..-2] assert "a" == s[0..<-1] 最後の動作に驚いたので Groovy の Range を調査する。 Range のプロパティ class MyRange extends AbstractList /* implements Range */ { int from, to boolean reverse MyRange(int from, int to) { this.reverse = from > to this.from = reverse ? to : from this.to = to ? from : to } int size() { return to - from + 1 } O

    Groovy の Range - コードの恵み
    fumokmm
    fumokmm 2011/03/11
    Rangeの話。
  • groovysh で任意の文字コードでロードする - コードの恵み

    Groovy では groovy.source.encoding オプションでデフォルトの文字コードを指定できる。 これを groovysh でも利用するようにしてみた。 src に含まれている org.codehaus.groovy.tools.shell.commands.LoadCommand.groovy を用意する。 load メソッドを以下のように修正する。 void load(final URL url) { assert url != null if (io.verbose) { io.out.println("Loading: $url") } def charset = System.getProperty("groovy.source.encoding") ?: System.getProperty("file.encoding") ?: java.nio.chars

    groovysh で任意の文字コードでロードする - コードの恵み
    fumokmm
    fumokmm 2011/02/22
    groovyshの話。
  • 1