Perl 6 is Smalltalk
Masak kindly pointed the general public to a blog post that talks about how awesome Smalltalk is.
The example presented there reads:
a < b ifTrue: [^'a is less than b'] ifFalse: [^'a is greater than or equal to b']
The basic idea is that ifTrue
and ifFalse
are methods on the class Bool
. Perl 6 don’t got that and I thought it would be tricky to add because augment enum
doesn’t work. After some tinkering I found that augment
doesn’t really care what you hand it as long as it is a class. As it happens Rakudo doesn’t check if the class is really a class, it simply looks for a type object with the provided name. The following just works.
use MONKEY-TYPING; augment class Bool { method ifTrue(&c){ self ?? c(self) !! Nil; self } method ifFalse(&c){ self ?? Nil !! c(self); self } } (1 < 2) .ifTrue({say ‚It's True!‘}) .ifFalse({ say ‚It's False!‘});
If we call only one of the new methods on Bool
, we could even use the colon form.
(True) .ifTrue: { say "It's $^a!" };
As you likely spotted I went a little further as Smalltalk by having the added methods call the blocks with the Bool
in question. Since Block
got a single optional positional parameter the compiler wont complain if we just hand over a block. If a pointy block or a Routine
is provided it would need a Signature
with a single positional or a slurpy.
Please note that augment on an enum that we call a class is not in the spec yet. A bug report was filed and judgement is pending. If that fails there is always the option to sneak the methods into the type object behind Bool
at runtime via the MOP.
And so I found that Perl 6 is quite big but still nice to talk about.
UPDATE: There where complains that IfTrue
contained an if
statement. That’s was silly and fixed.
-
January 9, 2017 at 23:062017.02 Dogfooding and Powerbotting | Weekly changes in and around Perl 6