Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clarify when do runs a block #4532

Merged
merged 2 commits into from
Nov 24, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions doc/Language/control.rakudoc
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,18 @@ parenthesize a statement if it is the last thing in an expression:
=for code :skip-test<syntax error>
3, if 1 { 2 } ; # Syntax error

As a consequence, C<do> does not run blocks that, by their syntax, must
be functions. For example, if C«->» is used to specify a
L<signature|/language/syntax#Block_declaration>, C<do> treats these as
single-expression statements.

Thus, adding C«->» to our first example prevents the closure from
being evaluated:

=for code
# This never dies and never prints "Heads I win, tails I die."
do -> { say "Heads I win, tails I die."; Bool.pick } or die; say "I win.";

=head1 X<start|Control flow,start>

The simplest way to run a statement or block B<asynchronously> is by writing C<start>
Expand Down