[tpm] Answers to some questions for tonight's talk
zoffix at zoffix.com
zoffix at zoffix.com
Thu Mar 31 04:55:03 PDT 2016
Turns out there's a much simpler way to check if a value fits a
subset: just smartmatch against it!
subset Even where * %% 2;
say 3 ~~ Even;
say 42 ~~ Even
# OUTPUT:
# False
# True
Hope this helps.
Cheers,
ZZ
Quoting zoffix at zoffix.com:
> Hey,
>
> Thanks again for having me.
>
> Now that I got a Perl 6 compiler at my hands to play with, I can
> answer a couple of questions that were asked:
>
> 1)
>
> Better messages for where { ... } subsets. The code in the `where`
> can be anything you want, so you can `warn` or `fail` inside the
> check to get a better error message. Once caveat: the argument given
> to `callframe` might be different depending on where you're
> performing the check. Try adjusting it:
>
>
> subset Foo of Int where {
> $_ > 10_000
> or fail "You need a number more than 10,000 on "
> ~ "line {(callframe 4).line}, but you passed $_";
> };
>
> my Foo $x = 1000;
>
> # OUTPUT:
> # You need a number more than 10,000 on line 7, but you passed 1000
> # in block <unit> at test.p6 line 2
>
> 2)
>
> As far as testing whether something fits the subset, you can use
> this trick with trying to assign to a variable and catching the
> exception. It feels a bit like a hack, but I'm unsure if there's a
> better way:
>
> subset Foo of Int where {
> $_ > 10_000
> or fail "You need a number more than 10,000 on "
> ~ "line {(callframe 4).line}, but you passed $_";
> };
>
> my $value = 42;
> try { my Foo $x = $value; CATCH { fail "It's no good" }; };
> say "It's fine";
>
> # OUTPUT:
> # It's no good
> # in block at test.p6 line 8
> # in block <unit> at test.p6 line 8
>
> 3)
>
> "Can you have an infinite Set?"
>
> No, it tries to actually create one. Makes sense, since a set cares
> about the elements. Sure, it's possible to special-case some forms
> of sequences to figure out whether an element is part of the
> sequence or not, but it's probably not worth it. In a more general
> case, you are faced with the Halting Problem. Speaking of which,
> here is a gotcha with the sequence operator and the upper limit:
>
> my @seq = 0, 2 ... * == 1001;
>
> Here, I'm using the sequence operator to create a sequence of even
> numbers, and I'm limiting the upper bound by when it'd be equal to
> 1001. But it won't ever be equal to that. To human brain, it might
> seem obvious that once you're over 1001, you should stop here, but
> to a computer it's a Halting Problem and it'll keep trying to find
> the end point (so it'll never complete here).
>
> 4)
>
> Places to learn Perl 6: along with http://perl6intro.com/ that I
> mentioned during the talk, there's also Learn X in Y Minues Perl 6
> page, which I personally found very useful when just starting out
> with Perl 6: https://learnxinyminutes.com/docs/perl6/
>
> I'm also including the link to the Ecosystem:
> http://modules.perl6.org/ you should have `panda` program
> installed, and you can install modules from the Ecosystem by typing
> `panda install Foo::Bar`
>
>
> These are all that I can remember being asked.
>
> Hope it helps.
>
> Cheers,
> ZZ
>
> _______________________________________________
> toronto-pm mailing list
> toronto-pm at pm.org
> http://mail.pm.org/mailman/listinfo/toronto-pm
More information about the toronto-pm
mailing list