2010-12-07 25 views
5

私は、HaskellとPerl6の両方の最も興味深い機能の1つは、計算値が実際に必要になるまで計算を延期できることです。Perl 5での遅延評価手法の例は?

Perl5はすぐにすべてを行うのが好きですが、私が知る限り、遅延評価に必要なすべてのプリミティブが含まれています。それらは以下のとおりです。サブルーチン内@_への参照を取る

  • は、これらの識別子のいくつかは、まだ値が含まれていない場合でも、その引数リスト内の識別子にエイリアスされ、配列の参照を作成します。
  • 内部で\@_を保持しているサブルーチンから過負荷の/縛られたオブジェクトを返し、必要に応じて逆参照します。 (とネクタイ/過負荷の詳細抽象化の様々なCPANモジュールがあります)

私は(私はHaskellのの公平なビットを実装した作品でモジュールを持っているPerlで様々な怠惰なプログラミング技術を実験してきましたPerl5のプレリュード(共回帰のようなもの:$_ = list 0, 1, zipWith {&sum} $_, tail $_ for my $fibs;はフィボナッチシーケンスを定義するために既に働いています))。しかし、私は、関数が大きな式/プログラムで使用されるときに現れるかもしれないコードに隠れている微妙なバグがあると感じています。

誰かがPerl5でHaskell/Perl6を使っていることを知っている良い例があれば(CPAN /ブログ/書籍)、私は疑問に思いますか?特に、私はこのタイプの怠惰を採用している相当なサイズのコードを読みたいと思っています。

私も、誰もが、私は最大の問題は、「Magicsはのクラッシュ」だと思います

+3

私はあなたがHigher Order Perlを読んだことを前提としています。イテレータ、無限のストリーム、および怠惰については、多くの素材があります。 –

答えて

9

高次のPerl(自由に利用可能なonline)には、「無限ストリーム」という章があります。たぶんそれは良い出発点です。

3

はPerl 5で遅延評価の実施を囲む任意の落とし穴または難治性の問題に実行しているかどうかを知るために興味があると思います。あなたが思うことをしようとしていると思うと思っていて、他のモジュールの作者が何かをしようとしていると思っていると思っていて、その結果は不確定です。誰の魔法が勝つの?

いつも別の変数の魔法の後ろを覗いたり、誤って魔法をかけることができるので、魔法は絶対に防弾ではありません。

包括的なケーステストによって100%の直交性を達成できれば、もっと簡単に...多分安心できるかもしれません。

+1

それが本当に魔法だったら、私の心とDWIMを読むでしょう。 – Ether

+2

@その他:あなたは* DWIMMER *とdweomer *を融合させます。 :) – tchrist

6

まあ、Mooselazy loading of attributesでこれを行います。

デフォルトとビルダーメソッド
属性は、デフォルト値を持つことができ、そしてムースは、そのデフォルト値を指定するには、2つの方法を提供しています。
["デフォルト"と "ビルダー"のオプションが説明されています...]

怠惰
ムースは「怠惰」属性をすることによってあなたは、属性集団を延期することができます:

has 'size' => (
    is  => 'ro', 
    lazy => 1, 
    builder => '_build_size', 
); 

「怠惰」は真である場合には、読者のメソッドが呼び出されるまで、デフォルトが発生していません、オブジェクト構築時ではなく、いくつかの理由がありますが、これを選択する可能性があります。

まず、この属性のデフォルト値が他の属性に依存する場合、その属性は「遅延」でなければなりません。オブジェクトの構築時には、デフォルトの が予測可能な順序で生成されないため、デフォルトを生成するときに他の属性が移入されることはありません。

第2に、必要になる前にデフォルトを計算する理由がないことがよくあります。属性を「遅延」にすると、属性が になるまでコストを延期できます。属性が必要でない場合は、CPU時間を節約できます。

もちろん、ビルダーまたはトリビアルではないデフォルトの属性を「遅延」にすることをおすすめします。

関連する問題