02:15 mahafyi left 04:14 mahafyi joined 04:30 gfldex left, gfldex joined 07:53 dakkar joined
mfiano What does the root object Mu stand for/mean? 09:23
lizmat Most Undefined 09:25
mfiano Thanks. Also what does the U type smiley stand for?
lizmat Undefined
I guess that's really a holdover from Perl :-) 09:26
mfiano The docs mention not to confused defined with definite. So does the D smiley stand for Defined then? I had assumed Definite
lizmat I guess nowadays it would be a :T for type object, and :I for instantiated :-)
definite 09:27
m: sub a(Failure:D) { }; a Failure.new
well, that works :-)
say Failure.new.defined # False 09:28
mfiano Right, Failure is a special case. I just find it odd that :U is not symmetrical like :I[ndefinite] :)
lizmat any class can be a special case, if they override the .defined and .Bool methods :-)
mfiano Right
Nemokosch what's the difference between defined and definite then? 09:29
lizmat basically, definite means that it is not a type object, that it is an instance 09:30
.defined is *usually* the same, but can be overridden
mfiano docs.raku.org/type/Signature
search for "definedness"
lizmat say Failure.new.DEFINITE # True
say Failure.new.defined # False 09:31
Nemokosch what is a "type object" then?
lizmat class Foo {} # Foo is a type object 09:32
class Foo { }; my $foo = Foo.new; # $foo is an instantiated object of type Foo
everything in Raku is an object, or has an object representing it (e.g. in the case of native integers) 09:33
Nemokosch hm, this terminology doesn't sound too helpful or even useful 09:34
mfiano An instance and a type smartmatch to a type. This is not always what you want in a signature object, so you can use type smiley's to choose either definite or indefinite objects. 09:38
# Str ~~ Str # True 09:42
# Str ~~ Str:D # False 09:43
If you add a type constraint to an optional parameter for example, and it is not supplied as an argument and doesn't have a default value, it receives the type object as its value
There are many cases where this is not what you want 09:44
09:51 mahafyi left
Nemokosch > If you add a type constraint to an optional parameter for example, and it is not supplied as an argument and doesn't have a default value, it receives the type object as its value 10:26
what the hell, why?
mfiano Because all parameters have values, even if they are un-used in the body block 10:29
This goes in hand with the Smalltalk inspiration of everything being an object
Nemokosch "everything is an object" fundamentally applies to Python and Javascript as well, I don't think it follows that an unused value should get an incompatible random value 10:36
In this regard, the None and undefined values seem much more fitting
mfiano Sure, but they came a few decades later :-) 10:37
Nemokosch Raku also came a few decades later 😄 10:38
mfiano and Smalltalk got it from Lisp
Nemokosch I mean, just because it's in Smalltalk, I don't think it automatically turns into reasonable behavior
and the quoted part (about the type object being implicitly the default value) sounds like plain madness to me 10:39
mfiano Maybe lizmat or somebody can explain why it is reasonable. My opinion is probably too biased to explain it properly, having used Lisp for more than 20 years. 10:40
Nemokosch It would make more sense in Javascript as a prototype based language but then again, "undefined means missing" still makes more sense than shifting between an "instance object" and a "type object" back and forth which are conceptionally different 10:41
lizmat my Int $a; say $a; # Nemokosch: what do you expect that to say ?
Nemokosch either 0 or an equivalent to undefined, I leave this up to one's temperament 10:42
mfiano I guess my Lispy answer to that would be: Nil
But I know its (Int)
lizmat say Int.defined # what do you expect that to say
Nemokosch I don't feel like I need that so I can't answer 10:43
lizmat well, Int is "an equivalent to undefined" in Raku 10:44
as are all type objects
Nemokosch the question is: why? it's on a different conceptual level
the Int type shouldn't be of Int type 10:45
and that's what it suggests
let's approach this differently, from the pragmatic side 10:46
when is this the behavior that one wants for a lacking Int value? 10:47
lizmat well, actually, Int is an instance of Perl6::Metamodel::ClassHOW
well, it expresses an unfulfilled expectation 10:48
mfiano If you supply a type constraint it can't be undefined, or the bottom type, or anything by definition.
If you don't supply a type constraint, it becomes Any
lizmat my Int $a; say $a # if that would say anything but (Int), it would mean that type checking is broken, as you've indicated you wanted to constrain to Int types 10:49
if you really want to make lack of a value an issue, you should constrain to instances
my Int:D $a # Variable definition of type Int:D needs to be given an initializer 10:50
mfiano Well said
Nemokosch > well, it expresses an unfulfilled expectation 10:51
That's what None, Nil, undefined all express without setting an unintuitive type structure
lizmat my Int:D $a = Nil # Type check failed in assignment to $a; expected Int:D but got Int (Int) (perhaps Nil was assigned to a :D which had no default?) 10:53
Nemokosch I've never been a big fan of static typing "for the sake of it", I feel we are bumping into conceptional issues again 10:54
lizmat my Int:D $a is default(42) = Nil; say $a # 42
my Int:D $a is default(42); say $a # 42
Nemokosch: I guess we can agree that we disagree on the sensibility of of Raku types / constraints / signature binding works 10:55
but I think you're about 18 years late in this discussion
Nemokosch it's important to draw attention to questionable decisions as well though 10:56
> if that would say anything but (Int), it would mean that type checking is broken, as you've indicated you wanted to constrain to Int types 10:57
this seems to be the only argument and well, this argument is very implementation-oriented
lizmat Nemokosch: a Pull Request tells more than a thousand words
if you think it should be different, please make an issue in the problem solving repo 10:58
Nemokosch so just to get this straight 11:02
```perl 11:03
my Int $a;
on this, I can call .new
lizmat yes 11:04
Nemokosch that's pretty interesting by itself if this isn't a prototype-based language but okay, apparently you can call .new on any integer value
11:04 samebchase joined
lizmat you can call .new on anything in Raku, even native types :-) 11:05
Nemokosch ```perl
> $a.^name
wait for a second
mfiano True.new # False :-) 11:06
Nemokosch do instance objects straight up cover the whole interface of a type object then?
lizmat well, enums are special in that respect :-)
mfiano: but that's effectively Bool.new 11:07
Nemokosch if they do, it can work consistently at the end of the day
lizmat instance objects *can* cover up the whole interface if they want to, yes 11:08
it all depends whether the class has different multi-methods for instantiated invocants and type object as the invocant
(or handles that in code inside an only method)
Nemokosch I mean, it seems like the approach is the other way around than I imagined 11:11
it's much more like everything is a kind of prototype 11:12
lizmat you could argue that, yes 11:13
Nemokosch or maybe it's more fitting to say given the context, value objects can "collapse into" the corresponding type object? 11:16
when True.new works and returns False, is it more like a conversion from True to Bool or True itself "does Bool"? 11:18
lizmat actually, I never considered calling .new on Enums... so I would need to think a out that 11:19
mfiano Hmm, I could use some clarification on a section of the class tutorial: docs.raku.org/language/classtut#Th...declarator 11:32
In reading that, it is unclear to me what prefixing "also" actually does, or if it is no different than simply "is ..." 11:33
11:34 camelia joined
mfiano Oh I see, it is inside the block 11:34
Hmm, not sure what this solves.
m: say "Hi, camelia!" 11:35
camelia Hi, camelia!
lizmat mfiano: I don't recall why "also" still exists, but I think it has to do with giving you some compile time flexibility in deciding on class hierarchy 11:38
mfiano That makes sense.
lizmat morirz++
11:48 mahafyi joined
Morfent m:``` 11:51
role Lazy {
# use ...;
also is #`[...] Int;
say Lazy.new;
lazy module loading in the case of roles
lizmat if you call .new on a Role, It will get punned into an anonymous class with the same name, and have .new called on that 11:52
Morfent i wonder if i can take advantage of this in `Data::Record`... 11:58
that module takes forever to precomp
another way to defer module loading is `role ...[::T] does T` parameterized by a `require`d type 13:29
that helps according to `raku --stagestat`, but parsing still takes a long time 13:30
maybe the module's too monolithic
that helps according to `raku --stagestats`, but parsing still takes a long time 13:32
14:39 mjgardner_ is now known as mjgardner 16:51 dakkar left
gfldex mfiano, Nemokosch#9980 please note that (almost) any assumption can be broken in Raku 18:25
consider: (my $oddject = Metamodel::ClassHOW.new_type(name => "")).&{.^add_method('FALLBACK', method ($name) { 'cheating' }); .^compose};
Nemokosch oddject xD 19:30
23:14 colemanx joined
colemanx Hello everyone. I've written a grammar, and it seems to have pinned a cpu, and my program doesn't finish. 23:15
Here is the github gist: envs.sh/AN 23:16
There is some sample data attached there, as well. I am familiar with regex, but not sure why the program doesn't finish. 23:17
[Coke] what are you passing as the path? 23:20
oh, data. 23:22
I recommend using Grammar::Debugger. 23:30
if you install that and use it in your program, you can see that it matches the first sep, and then tries to match an item and immediately goes into the weeds
also: "item" is apparently special, don't use that as a name. 23:40
once it starts parsing, you start getting errors about wrong number of args because it's trying to give it to a different item. 23:41
gist.github.com/coke/f1d594983af0a...3cbc235608 23:42
colemanx Thank you, I was afk for a bit, but I'll install Grammar:Debugger 23:56