Here's another example from gtk-simple: https://github.com/perl6/gtk-simple/blob/d1fcc6efe1da3fd88a26b4328d6537c58607dee7/examples/07-text.pl6
Written with cascade: https://gist.github.com/dharmatech/b8e8a71da8149382f192603e1b92d9b8 Ed On Mon, Jun 6, 2016 at 4:12 PM, Eduardo Cavazos <wayo.cava...@gmail.com> wrote: > Looks like I can get pretty close to what I was looking for with this > subroutine: > > sub cascade ($obj, &proc) { proc($obj); $obj; } > > Then, given the Point class again: > > class Point { has $.x is rw; has $.y is rw; } > > this: > > (Point.new.&cascade: {.x = 10;}; Point.new.&cascade: {.y = 20;}) > > returns: > > (Point.new(x => 10, y => Any) Point.new(x => Any, y => 20)) > > This came out of looking to see if it was possible to support method > cascade syntax in Perl 6. See this question on stackoverflow: > > http://stackoverflow.com/questions/37559870/method-cascade-syntax > > Below, I've included the gtk-simple example written to use 'cascade'. > > As an aside, the Swift community has been discussing adding something like > 'cascade' to their standard library under the name 'with': > > https://gist.github.com/erica/96d9c5bb4eaa3ed3b2ff82dc35aa8dae > > Ed > > use v6; > > use GTK::Simple; > > sub cascade ($obj, &proc) { proc($obj); $obj; } > > GTK::Simple::App.new(title => 'abc').&cascade: { > > my $app = $_; > > my $button; > > .set-content: > GTK::Simple::VBox.new( > GTK::Simple::Button.new(label => 'bcd').&cascade: { > .clicked.tap({ .sensitive = False; $button.sensitive = > True; }); > }; > > $button = GTK::Simple::Button.new(label => 'cde').&cascade: { > .clicked.tap({ $app.exit; }); > } > ); > > .border-width = 20; > > .run; > }; > > > > On Mon, Jun 6, 2016 at 1:12 PM, Eduardo Cavazos <wayo.cava...@gmail.com> > wrote: > >> Hello, >> >> Here's a simple class: >> >> class Point { has $.x is rw; has $.y is rw; } >> >> 'with' seems to return the result of evaluating the block. E.g. this >> expression will return a Point: >> >> with Point.new { .x = 10; $_; } >> >> Whereas this will return 10: >> >> with Point.new { .x = 10; } >> >> Is there a way for a user to define a variant of 'with' which returns the >> target object instead of the result of the evaluating the block? I.e.: >> >> with_alt Point.new { .x = 10; } >> >> would return a Point. >> >> And this: >> >> (with_alt Point.new {.x = 10}; with_alt Point.new {.y = 20}) >> >> would return a list of two Points. >> >> Thanks! >> >> Ed >> > >