タグ

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

  • Learn you a Clojure for Great Groovy! - コードの恵み

    最近話題のタイトルは、たのしく読んでいる途中(9章に入った)。 その話ではなく、このエントリは Clojure で Ninety-Nine Prolog Problems をやっているときに思いついたもの。 1. Prolog Lists - Prolog Site Ninety-Nine Prolog Problems も Lists のところだけ、現在 Groovy, Haskell, Scala, Prolog, Clojure で解いた。*1 Lists の前半のクライマックスは encode-direct 辺りだが Groovy に較べて Clojure は簡潔に書けてしまう。 ;; 1.13 (defn encode-direct [s] (for [[n c] (map (juxt count first) (partition-by identity s))] (if (=

    Learn you a Clojure for Great Groovy! - コードの恵み
  • { owner.call() } - コードの恵み

    Groovy では木構造が次の形で表現できるらしい。 def tree = { [:].withDefault{ owner.call() } } def users = tree() users.harold.username = 'hrldcpr' users.yates.username = 'tim' def json = new groovy.json.JsonBuilder(users).toString() assert json == '{"harold":{"username":"hrldcpr"},"yates":{"username":"tim"}}' これは harold cooper 氏の Python One Liner を def tree(): return defaultdict(tree) Tim Yates 氏が Groovy に翻訳して def tr

    { owner.call() } - コードの恵み
  • なぜメモ化も重要か - コードの恵み

    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

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

    groovysh でライブラリを参照したかったので Grape について調べた。(Groovy 1.8.0 時点) 参考 http://groovy.codehaus.org/Grape http://groovy.codehaus.org/Japanese+Grape groovy.grape.Grape.grab メソッド スクリプトで使用する @Grab の代わりに groovy.grape.Grape.grab メソッドを使用すればよいみたいだ。 @Grab は AST 変換で static イニシャライザでの Grape.grab 呼び出しに書き換えられているらしい。 @Grab(group='commons-primitives', module='commons-primitives', version='1.0') import org.apache.commons.col

    Grape - コードの恵み
  • Groovy の型変換 - コードの恵み

    型変換についてのメモ。 プログラムの挙動がおかしいと思ったときに読み返すためのもの。 Scala の implicit conversions implicit conversions が試されるのは 要求された型への変換 変数宣言の型への変換 メソッド呼び出しの引数の型への変換 レシーバの変換 Groovy では use キーワードによるカテゴリがこの機能に対応する。 2 は Groovy では引数の型でメソッドを選択するので対応するメソッドを用意することになる。 1 はカテゴリでは対応できない。 Groovy の型変換 強制型変換 演算によって型が変わる 演算で Double か Float を使用すると Double になる 演算で BigDecimal を使用すると BigDecimal になる 演算で BigInteger を使用すると BigInteger になる 演算で Lo

    Groovy の型変換 - コードの恵み
  • Parser Combinator ライブラリを使ってみる - コードの恵み

    数式のところを Java のライブラリで書いてみる。*1 JParsec http://jparsec.codehaus.org/ @Grab('jparsec:jparsec:2.0') import org.codehaus.jparsec.Parser import org.codehaus.jparsec.Parser.Reference import org.codehaus.jparsec.functors.* import org.codehaus.jparsec.pattern.CharPredicate import static org.codehaus.jparsec.Parsers.* import static org.codehaus.jparsec.Scanners.* // Parser Parser<Void> digit = isChar(Charact

    Parser Combinator ライブラリを使ってみる - コードの恵み
  • Parser Combinator - コードの恵み

    Graham Hutton 氏の『プログラミング Haskell』 第8章 関数型パーサーを Groovy で書く。 Page Redirection にコードがあるがテキストとは少し違う。 Parser で扱う補助的な関数を定義する Closure を Parser として扱うので Parser 自体は定義しない Just は単にタプルのファクトリメソッドで Haskell の Maybe の実装ではない*1 Groovy では Haskell と違い String と List は別物なので同じ様に扱うための関数を定義する*2 class Parsers { // Parser<A> = { String -> Maybe<A, String> } // parse = { Parser<A>, String -> A } static def parse(Closure p, inp

    Parser Combinator - コードの恵み
  • 1