マップをシンクコンテキストに置くことはできません


8

シンクコンテキストでマップをスローする方法を確認しようとしています。このコードでは

class Sunk {
    has $.titanic;
    method sink {
        say "Sinking $!titanic";
    }
}

Sunk.new( :titanic($_) ) for 1..3;

(1..3).map: { Sunk.new( :titanic($_) ) };

forループが効果的に作成されたすべてのシンク、mapしません。なぜか?

ローストでのこのテスト:https : //github.com/perl6/roast/blob/b9bfe1844db25f65a4aeb351a0107f83689cb5c2/S04-statements/sink.t#L27-L32は、そのテストとして機能するはずです。そして、マップは効果的にシンクコンテキストにありますが、どのように「沈み込んで実行される」のかわかりません。それは単に実行されます。

回答:


6

あなたの例でmapは、SeqSunkオブジェクトを含むa を返します。全体Seqが沈んでおりSeq.iterator.sink-all、これはを効果的に呼び出しますが、その要素のすべてをシンクするわけでありませ。それは、が返されるまでSeq呼び出すことによって、空をプルするだけです。pull-oneIterationEnd


5

説明することはあまりありませんが、その大部分を最後まで残します。

シンクコンテキストでマップをスローする方法を確認しようとしています。

--> Nilブロックの戻り値として追加すると、次のようになります。

(1..3).map: -> $_ --> Nil { Sunk.new( :titanic($_) ) }

forループが効果的に作成されたすべてのシンク、mapしません。

デフォルトでは、ブロックは以下で実行されます:

  • シンクコンテキストの最後以外のすべてのステートメント。

  • 最後のステートメントシンクコンテキストではありません。(最後のステートメントはブロックの戻り値なので、シンクに落とすことは不適切であると推定されます。)

コードはmap呼び出しのこのデフォルトを変更しなかったため、ブロックの最後のステートメント(その唯一のステートメント)はシンクコンテキストにありませんでした。(--> Nilブロックの署名に追加すると、最後のステートメントがシンクコンテキストに戻ります。)

このデフォルトスキームの例外には、ある種のステートメントキーワードが含まれます。forこれらの1つです。そのステートメントまたはブロックの最後のステートメントをシンクコンテキストに置きます。(への最後の文があるので、こと、それを元に戻すことはないシンク文脈で、あなたのような何かを書くことができます$ = do for ...。)

ローストでのこのテストは、そのためのテストとして機能するはずです。そしてmap、シンクのコンテキストでは効果的ですが、それがどのように「沈み込んで実行される」かはわかりません。それは単に実行されます。

対応するチケットとテストで混乱しいます。申し訳ありませんが、私はそれを手伝うことはできません。


私はこの答えを準備するために何時間もの研究をしました。私が見つけて頼りにしたいくつかの作品が、私の簡単なメモとともに続きます。

次のリンクの多くは、IRCログの特定の行に移動します。それらのほとんどの私の意図は、各行に続くダイアログを少し読んで、そこから得られるものを最大化することです(それが混乱したとしても、次に説明するように、それが役立つかもしれないと思うので)。

少なくとも以下の概要を読み、いくつかのリンクをクリックすることを検討してから、この回答の下にコメントを投稿して、ここでさらにディスカッションを促し、より明確にすることができるかどうかを確認してください。


回答に感謝しますが、あなたの例では、マップによって返されるすべての要素は、マップ自体ではなくシンクコンテキストでスローされます。@ elizabeth-mattijsenの答えはそれを釘付けにすると思います。
jjmerelo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.