ハイウェスト日記経由で、「Groovy 1.8 beta3 からClosureのメモ化ができるようになった」とのことを知り、情報を探してみました。 Implement closure memoization, like in GPars を読むとクロージャに以下の3つのメソッドが追加されています。 memoize() memoizeAtMost(n) memoizeAtLeast(n) memoizeBetween(m, n) メモ化と似たようなことは前に、Mapのデフォルト値設定(Map#withDefault{})を使ってやってみたりしたことがありましたが、要はパラメータに応じた呼び出し結果のキャッシュです。 今回定義されたクロージャのメソッドmemoize()を呼ぶと、「キャッシュするバージョンのクロージャ」を作って返してくれるようです。 ドキュメントコメントを読むと、キャッシュはL
はじめに クロージャ(groovy.lang.Closure)を引数にとって、途中の処理を委譲するようなメソッドを定義し、呼び出し時にブロックのように呼び出すことはGroovyでは普通に行われます。 ただ、通常では#callメソッドに渡す引数がクロージャ内で -> の前に列挙した変数として受け取れるといった使い方くらいしかしないと思うのですが、ちょっと工夫することで、色々できることが分かりました。以下実験したソースを載せます。 ソース (動作確認: Groovy Version: 1.7.5 JVM: 1.6.0_20) localValsという一時変数オブジェクトを生成して、そこへの参照でクロージャのdelegateを書き換えます。すると、クロージャ内部から一時変数オブジェクトのスコープが覗けるようになり、ここで定義してあるmapやthatなどにアクセスできるようになるという仕組み。 実
ついにJavaにもクロージャ導入か!?という、注目のProject Lambdaのセッションです。 実際のところ、クロージャと言うより、匿名内部クラスよりは見やすい新たなラムダ式の記法ってだけなんですけども。 とりあえずメンドイし、厳密な定義とかあまりよく知らないので、新しいラムダの記法を「クロージャ」って書いときます。 なぜ今更Javaにクロージャを導入するのか? ムーアの法則における成長限界もあるし、将来的にマルチコアによる並列処理が主流になってくるので、マルチコアをもっと引き出すような言語サポートが必要だよね、というのが主な動機だそうです。 確かに現状でも優秀なjava.util.concurrentパッケージがありますが、万人向けとは言い難い。もっと手軽に利用できて、かつ、コードが読みやすくなるようにしていかないと。 パラレル処理がかんたんに書けないなら、シーケンシャルに書いちゃう
Advantages Verified casino Over 1000 games Fast payouts First deposit bonus 24/7 player support Know more Casinonic Review - Games, Bonus and Sign-in Form Casinonic is a representative of the Australian gambling industry. Recently Australian casinos have become popular among gamblers. They guarantee a fair gambling experience and a great variety of gambling options. It appeared in 2019 and has
最近 JavaScript を書く機会が増えているが、それに従って自分のコーディングスタイルが少しづつだが変化してきているのが分かる。もともと「コードの読みやすさ」や「実行効率」にとことんこだわるタイプだが、(JavaやC++になくて)JavaScriptやRubyにあるクロージャや無名関数が私のコーディングスタイルにとてもマッチしているからだと思う。 簡単な例を紹介しよう。Pythonで書かれた config.py というモジュール。config.yamlという設定ファイルを読み込んで Dictionary として返す config.get() という関数。普通に実装すると、以下のような感じになる。 import yaml _config = None def get(): global _config if not _config: data = open('config.yaml')
groovyのクロージャをブロックとして使っていると、breakとかcontinueとかができませんのできっと誰もが最初はあれ?と思ったはず。 理由は単純で、クロージャというのは無名メソッド定義であって、たまたま平たくコード中にならんでいて、スコープ則にしたがって変数参照ができますが、実体は別メソッドなんですね。 eachのループからbreakしたければ例外をthrowするか、元になるコレクションをあらかじめgrepとかでフィルタリングしてやるのも手です。continueしたい場合はreturnするとループの次の回に入ります。 多重のループ中から脱出したりするのにも、例外を使うのも考慮しても良いかもしれません。 ここらへん、RubyのProcのように、まるで本当にブロックのように振舞うように機能を追加することは、可能なのかもしれません。ただそれがないゆえの単純さがGroovyのクロージャに
前に lambda lifting という言葉を聞いてから、ずっと妄想しているのは、クロージャとオブジェクトは「似ている」のではなく「同じ物」なのではないかという事。lambda lifting というのはクロージャをコンビネータに変形する操作の事で、多分簡単に書けば function f() { var a = 1 return function() { return a * 2 } } のような関数を function g(env) { return env.a * 2; } function f() { var a = 1 return g({a: 1}); } のように書き直してスコープをまたがる a のような変数アクセスを無くす事だと思います。で、これなんかに似てるなーと思ったら、オブジェクト指向言語のメソッドにそっくりです。python や perl のような言語ではレシーバを
「偽札対応済み」って書いてある両替機。 川口市立中央図書館…本屋の上にある図書館。に行ってきた。特に何もないけど。あと、マイコンショップ川口つぶれてた。 ある程度能力を持ってるなら、成果を残せるか残せないかは自信を持ってるか持ってないかの違いだけかもしれないというような話。 最近思うのだけど、使えない奴(例えば、僕のような)の特徴として、「どうせ自分が何をどうやっても、何もどうにもならない」的な思考があると思う。 例えば、上の一行で言うと、「使えない奴(例えば僕」とか、そういったような思考。 こういった思考は、いったん根付いてしまうと、循環するので、なかなかやめられない。「どうせ自分は何もできないんだ→何もできないから何もやらない→何も成果を残せない→どうせ自分は何もできないんだ」とかいった感じで。 矯正しようと思っても、「いや、こういう性格だから、矯正は無理だし。」と、いう思考になってし
http://martinfowler.com/bliki/CollectionClosureMethod.html (detectとinject部分を明確にするよう更新) Smalltalkでプログラミングを始めたときから、コレクションクラスが好きでした。 よく使う強力なオペレーションを簡単に使うことができました。 Javaが登場したとき、このようなメソッドがなくなって物足りないと感じました――Java(およびC#)のコレクションは、Smalltalkのそれと比べて非常に限定されたものでした。 というのも、JavaにはClosureが実装されていなかったからです。 Smalltalkの強力なコレクションのメソッドは、すべてクロージャに依存しています。 近年、私はRubyで頻繁にプログラミングをするようになりました。 Rubyに引き付けられたのは、Rubyには強力なコレクションメソッドがあ
「クロージャ、それなに?」ってエントリーで、「『クロージャ』って言葉の意味がわからない」と言ったのですが、lethevertさんからのトラックバックやshiroさんのコメントで多少は状況が見えてきました。 sumiiさんの 解決しかかったところで余計なことをいって混乱に拍車をかけてみる。 で確かに混乱はしたものの、さらにlethevertさんの解説が続いたので、自分なりの目星はついた気がします。 最近の傾向 ラムダ式(に相当するもの)やデータのように扱えるコードブロックをクロージャと呼ぶのが最近の傾向みたいですね。しかも、プログラミング言語の機能/能力として捉えることが多いようです。「ナントカ言語はクロージャが使える」みたいな用法で。 多くの人がそういう意味で使うなら、「本来は…」みたいなこと言ってもしょうがないので、別にいいや。 「ラムダ式+環境」というデータ構造 僕自身は、クロージャ=
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く