»ö« Welcome to Perl 6! | perl6.org/ | evalbot usage: 'p6: say 3;' or rakudo:, or /msg camelia p6: ... | irclog: irc.perl6.org or colabti.org/irclogger/irclogger_logs/perl6 | UTF-8 is our friend!
Set by moritz on 22 December 2015.
geekosaur mm, maybe that's where the original arguments came from. (also have a vague recollection that lizmat had fixed this in the newio branch and was rather put out about the whole thing) 00:04
00:18 pierre_ joined 00:23 pierre_ left 00:31 cygx left 00:43 zakharyas left 01:03 aborazmeh joined, aborazmeh left, aborazmeh joined
eisen74 umm. So, before I crack open the threading topic, I'm not seeing any errata. Going to exercise it pretty hard and see what happens. Any warnings? 01:24
AlexDaniel eisen74: do not use hyper/race 01:31
… and do not use any async features in general… 01:32
eisen74: anyway, go here: rt.perl.org/
eisen74: and type [CONC] into the search box 01:33
eisen74: or just see the list here: perl6.fail/t/CONC
did that answer your question? 01:35
01:43 raiph left 01:44 raiph joined 01:48 raiph left, raiph joined 01:55 nowan left 01:57 nowan joined 01:59 raiph left, raiph joined 02:01 raiph left, raiph joined 02:03 raiph left, raiph joined 02:05 aborazmeh left 02:07 aborazmeh joined, aborazmeh left, aborazmeh joined 02:09 bjz left, bjz_ joined 02:37 wamba joined
dalek c: 4702f50 | (Breno G. de Oliveira)++ | doc/Language/typesystem.pod6:
small typo fixes
02:42
synopsebot6 Link: doc.perl6.org/language/typesystem
c: 547469a | (Aleks-Daniel Jakimenko-Aleksejev)++ | doc/Language/typesystem.pod6:
Merge pull request #1015 from garu/patch-1

small typo fixes
synopsebot6 Link: doc.perl6.org/language/typesystem
samcv can you have a named regex which returns the match but transformed some way or is this not possible? hmm may dig into grammars 02:43
02:44 obfusk left, obfusk_ joined 02:45 ilbot3 left 02:47 ilbot3 joined
seatek samcv - yeah that's exactly what grammars are great at 02:48
samcv been reading so much S05 these last few days 02:49
seatek This is an easy walk in grammars docs.perl6.org/language/grammar_tutorial
02:53 BenGoldberg joined 03:06 kent\n left 03:08 canopus left 03:11 wamba left 03:15 canopus joined 03:16 kent\n joined 03:17 bjz_ left 03:19 bjz joined 03:31 cdg joined 03:34 noganex joined 03:35 kurahaupo joined 03:36 cdg left 03:38 noganex_ left
samcv gist.github.com/1d0086fcb06a9e8be8...357d04ecf0 getting too many positionals passed with this 03:44
not sure if you know seatek
passing "www.google.com" works but "www.google.com/something" gets that error
Too many positionals passed; expected 1 argument but got 2 03:45
in regex after at ./lib/URL/Find.pm6 line 25
did not have that problem when I was just using it as a standard regex, so it's unchanged compared to that
hmm i found this rt.perl.org/Ticket/Display.html?id=128832 could be the same problem? 03:48
geekosaur looks to me like you use <term> but don't define it, so may be getting one you don't expect 03:51
samcv isn't it defined on the line above?
geekosaur oh wait, I missed it the first time :/
samcv regex TOP { <anyprotocol> '://' <base> [ ['/' <term>]+ ]? '/'? }
this works fine though 03:52
if i just put what was in after and put that.
also oddly. unless i comment out the "token after" i get the crash even if i never use the after token
anywhere
geekosaur what happens if you remove the <!after <protected>>? 03:53
03:53 pierre_ joined
seatek yeah it looks kinda circular there 03:53
samcv that works geekosaur
ah it looks like the naming of that regex was poor, and caused it to fail in only some circumstances 03:54
seatek term is part of after... and you're defining term with after
geekosaur no, <!after> is not that token 03:55
samcv well not using token after in that, but i think it WAS using it as the token
yes
idk i think it may have gotten confused. because i meant !after not that token
renaming token after, to something else fixes it 03:56
so it had to do with how it was named
geekosaur oh, interesting. I think we have a language collision
samcv yeah it worked fine as regex, but as a grammar, it was acting differently
seatek kboom
03:56 Herby_ left
geekosaur you intended negative lookbehind, but I think that overlaps 03:56
seatek ah 03:57
samcv i think in grammars you don't need to declare things you use before where you use them right? but in regex you do?
seatek seems to me like it's all assembled at once just like a class 03:58
samcv yeah exactly
geekosaur right, <!some_token> is also syntax, so it's using that over the negative lookbehind. probably also happens with <!before foo> 04:00
might file that as a bug
04:02 khw left
seatek yeah it would be nice if that failed instead of quietly doing secret things 04:04
geekosaur I'm not actually sure which one should win or which one should warn 04:05
samcv maybe rakudo should warn?
the error is in MoarVM
geekosaur but either way it should probably warn about defining a token 'before' or 'after' because of the conflict with lookahead syntax
samcv yeah 04:06
geekosaur maybe only if it actually sees it used as <!...> because the <?...> form and <...> forms should be fine
just the conflict between negated token match <!foo> and the negative lookahead/behind assertions 04:07
04:14 wamba joined, aborazmeh left 04:26 AlexDaniel left 04:31 khw joined 04:40 khw left 04:47 skids joined 04:53 kurahaupo left, kurahaupo joined 05:00 lucs left 05:06 edenc left 05:14 Cabanossi left 05:18 Cabanossi joined 05:20 wamba left 05:32 cpage_ joined 05:41 jameslenz left, labster left, jameslenz joined, labster joined
samcv how can i access a grammars tokens and regex from outside it? i can't access them as methods. anybody know? 05:44
psch m: grammar G { token foo { \d+ } }; my &foo = G.can('foo')[0]; say &foo 05:46
camelia rakudo-moar e9487d: OUTPUT«token foo { \d+ }␤»
psch samcv: note though that doesn't really get you much, it's still a grammar-bound rule 05:47
m: grammar G { token foo { \d+ } }; my &foo = G.can('foo')[0]; say "123" ~~ &foo # as such...
camelia rakudo-moar e9487d: OUTPUT«Type check failed in binding to <anon>; expected G but got Cursor (Cursor.new)␤ in regex foo at <tmp> line 1␤ in block <unit> at <tmp> line 1␤␤»
psch samcv: if you want to match only a specific rule (well, and the rules it calls) you can pass :rule too .parse 05:48
m: grammar G { token TOP { <foo> ** 2..* }; token foo { \d+ } }; my &foo = G.can('foo')[0]; say G.parse("123", :rule<foo>) 05:49
camelia rakudo-moar e9487d: OUTPUT«「123」␤»
samcv well i mean without calling parse. that's not what i want really. i mean. access the rule's i've defined outside of the grammar object
psch samcv: what does 'access' mean?
samcv: i mean, .^can does give you the rule, so that's already 'access', but you can't use it for matching 05:50
samcv use it in regex like /<grammar.class>/
hmm
psch ah, okay
samcv there is a way. i read about it i forget when
but i can't find it again for the life of me
psch m: grammar G { token foo { \d+ } }; say "123" ~~ /&<G::foo>/ 05:51
camelia rakudo-moar e9487d: OUTPUT«「123」␤ G::foo => 「123」␤»
samcv that was it! i know it was grammar::something but, i need the & :)
thank you
06:01 aborazmeh joined, aborazmeh left, aborazmeh joined 06:02 woodruffw left 06:07 woodruffw joined 06:10 atta left 06:30 kurahaupo left 06:37 bonsaikitten left 06:43 xiaomiao joined 06:53 aborazmeh left 07:12 darutoko joined 07:32 BenGoldberg left 07:35 skids left 07:39 Tonik joined 07:58 pierre_ left 08:00 eisen74 left 08:03 eisen74 joined 08:07 rpburkholder left 08:20 mr-foobar left 08:21 mohae left 08:45 eisen74 left 08:48 dextertzu left 08:54 firstdayonthejob joined 08:59 pierre_ joined 09:02 rpburkholder joined 09:03 pierre_ left 09:05 rindolf joined 09:06 FROGGS joined
FROGGS o/ 09:08
09:12 dextertzu joined 09:21 pierre_ joined 09:28 RabidGravy joined
moritz \o 09:29
is there any way I can have a multi sub MAIN (Int $x) and a multi sub MAIN (Str $) without getting ambiguous dispatch in the Int case (which actually becomes an IntStr)?
neither a where clause nor an "is default" seems to disambiguate 09:30
samcv how was it you print out every method an object has? i forget 09:31
moritz .^methods, .^methods(:all)
samcv yey
FROGGS moritz: I guess you'd need a subset of Str which only matches things that do not look like an Int 09:32
09:33 xiaomiao left 09:34 xiaomiao joined, wtw_ is now known as wtw 09:35 labster left 09:36 labster joined
FROGGS m: multi MAIN (Int(Str) $int) { say "int" }; multi MAIN (Str $str where { $_ !~~ /^\d+$/ }) { say "str" }; MAIN "42"; exit 0 09:36
camelia rakudo-moar e9487d: OUTPUT«int␤»
FROGGS moritz: ewww, there should be a shorter way
(and a more correct one) 09:37
moritz m: INIT @*ARGS = '42'; multi MAIN (Int(Str) $int) { say "int" }; multi MAIN (Str $str where { $_ !~~ /^\d+$/ }) { say "str" }; MAIN "42"; 09:38
camelia rakudo-moar e9487d: OUTPUT«int␤Ambiguous call to 'MAIN'; these signatures all match:␤:(Str $int)␤:(Str $int)␤ in block <unit> at <tmp> line 1␤␤»
moritz FROGGS: ^^ it doesn't work, because MAIN-HELPER (or whatever it's called) converts the '42' to an IntStr that matches both candidates
and it doesn't have the intelligence to do the topologial sorting of candidates that normal multi dispatch does 09:39
m: INIT @*ARGS = '42'; multi MAIN (Int $int) { say "int" }; multi MAIN (Str $str where { $_ !~~ /^\d+$/ }) { say "str" }; MAIN "42";
camelia rakudo-moar e9487d: OUTPUT«Cannot resolve caller MAIN("42"); none of these signatures match:␤ (Int $int)␤ (Str $str where { ... })␤ in block <unit> at <tmp> line 1␤␤»
FROGGS well, then we have to fix that first 09:40
moritz m: INIT @*ARGS = '42'; multi MAIN (Int $int) { say "int" }; multi MAIN (Str $str where { $_ !~~ /^\d+$/ }) { say "str" };
camelia rakudo-moar e9487d: OUTPUT«int␤»
FROGGS m: INIT @*ARGS = '42'; multi MAIN (Int $int) { say "int" }; multi MAIN (Str $str where * !~~ /^\d+$/) { say "str" }; 09:41
camelia rakudo-moar e9487d: OUTPUT«int␤»
FROGGS m: INIT @*ARGS = '42'; multi MAIN (Int $int) { say "int" }; multi MAIN (Str $str where +*) { say "str" };
camelia rakudo-moar e9487d: OUTPUT«str␤»
FROGGS m: INIT @*ARGS = '42'; multi MAIN (Int $int) { say "int" }; multi MAIN (Str $str where !+*) { say "str" };
camelia rakudo-moar e9487d: OUTPUT«int␤»
FROGGS :P
m: INIT @*ARGS = '42'; multi MAIN (Int $int) { say "int" }; multi MAIN (Str $str where not *.Int) { say "str" }; 09:42
camelia rakudo-moar e9487d: OUTPUT«int␤»
FROGGS that's actually better than the regex
m: INIT @*ARGS = '42hurz'; multi MAIN (Int $int) { say "int" }; multi MAIN (Str $str where not *.Int) { say "str" };
camelia rakudo-moar e9487d: OUTPUT«str␤»
09:46 Lucas_One left
moritz multi sub MAIN(Str $input where { try Date.new($_) }) { 09:47
that's what I have now :-)
09:50 rindolf left, labster left 09:55 rindolf joined 10:04 ShoaibJahejo joined
seatek one day i'll create pretty code that can generate SQL statements. but not today. 10:06
10:16 rindolf left
RabidGravy seatek, strangely I am working on just that thing 10:16
10:17 wamba joined
RabidGravy I had it working, then decided that I didn't like it, then something started segfaulting then started re-working it and now it doesn't work again 10:17
except for the pretty bit, it's not pretty
seatek RabidGravy: what is it about SQL that thwarts EVERYTHING
RabidGravy the grammar of SQL is unlike the structures of other languages 10:19
seatek i'm using loop structures like i haven't used in years... concatenating strings... it's like something exploded
i was even using the old style c for loop at one point
RabidGravy oh I've got lots and lots of multis
seatek hehe -- i tried grammars at one point too :) 10:20
maybe we're trying to make it too generic.. that's what i'm thinking more and more
i'm looking for the holy grail one ultimate function 10:21
well, for a search/select... ;)
i've come down to making a very, very complex and obtuse one that's hidden away in a base class... and up the chain, i encapsulate it with growing easiness ;) 10:22
and writing tests like made 10:23
mad
10:24 Tonik left
seatek how are you stacking up multis for this? that's interesting to think about. building in pieces? 10:24
i am not starting again. never mind :) 10:25
10:25 Lucas_One joined
RabidGravy yeah, build in tiny pieces, which I think is at root of the segfaulting 10:26
seatek and then you'll remember later on that you forgot about dealing with join, and your whole stack will come crashing down 10:27
i hope not :)
i keep remembering and needing these fringe cases that just ruin everything 10:28
how could that segfault?
you must be doing very weird things 10:29
RabidGravy that's why you do it in pieces, build the where, build the join, build the order and stitch them together at the last minute
seatek youre using multi subs for that?
RabidGravy it's the GC kicking in
seatek Yeah you must be doing really weird things 10:31
RabidGravy it's the size of the tests (which I have adapted from those of SQL::Abstract) - which is basically a big array pf hashes 10:32
seatek are you going to put this out in the ecosystem? 10:33
i checked and there was nothing, so i've been creating yet another from scratch
id' say i wished that dbixclass could come over... but i swear i spend just as much time troubleshooting the oddities of that as i do anything else 10:34
though for simple stuff it's so nice. 10:35
10:37 wamba left
moritz the #= examples in perl6advent.wordpress.com/2014/12/...t-of-main/ don't seem to work anymore 10:38
what's the current syntax for that?
10:38 wamba joined
moritz ah, #| 10:39
seatek you mean for commenting? 10:40
FROGGS moritz: I believe #= and #| switched their position 10:41
seatek i got hooked on #|{ blah blah } -- enclosing with the brackets seems to "hook" it to methods in the auto-generated POD documenation too, which is really, really nice 10:43
10:45 dextertzu left
samcv it is seatek :) 10:46
seatek curious - that reminds me - I think I remember finding that command line arguments to MAIN required that an '=' sign be appened to the argument when something needed to be assigned -- it wouldn't take the normal --option optionText that you could usually do 10:48
it required you always do --option=optionText
is that the set in stone standard?
moritz m: INIT @*ARGS = '--foo', 'value'; sub MAIN(:$foo) { say $foo }
camelia rakudo-moar e9487d: OUTPUT«Usage:␤ <tmp> [--foo=<Any>] ␤»
moritz huh, I thought it worked unless you explicitly marked your options as Bool 10:49
seatek: you might want to investigate the history of that feature; it might have been different in the past
seatek seatek: k
moritz btw I blug again: perlgeek.de/blog-en/perl-6/2016-bo...perl6.html 10:50
seatek i'll subscribe to that ;) 10:52
you've thrown me into an existential stupor, having to confirm my humanity 10:54
10:55 rindolf joined
stmuk_ moritz: I don't understand why pl6anet.org isn't picking up your blog .. tried changing http to https 10:55
wondering if it doesn't like pubdate 00:00:00 10:56
10:59 dextertzu joined 11:01 brillenfux joined
FROGGS moritz++ # blug 11:10
stmuk_ or more likely confused with urls 11:14
** GET perlgeek.de/blog-en.cgi/perl-6/index.rss ==> 200 OK 11:16
grrr
nine seatek: maybe something like this? niner.name/talks/DBIC%20in%20Perl%2...revisited/ 11:17
seatek: regarding SQL 11:18
11:20 vendethiel joined
vendethiel o/ 11:21
m: ('hey' ~~ /.+/) === ('foo' ~~ /.+/); # is that expected? 11:22
camelia rakudo-moar e9487d: OUTPUT«WARNINGS for <tmp>:␤Useless use of "===" in expression "('hey' ~~ /.+/) === ('foo' ~~ /.+/)" in sink context (line 1)␤»
vendethiel m: say ('hey' ~~ /.+/) === ('foo' ~~ /.+/); # is that expected?
camelia rakudo-moar e9487d: OUTPUT«True␤»
samcv how can i tell the location of the file I'm looking at with p6doc?
is there a way to do that? 11:23
11:23 brillenfux_ joined
samcv m: {'hey' ~~ /.+/} === {'foo' ~~ /.+/}; 11:23
camelia rakudo-moar e9487d: OUTPUT«WARNINGS for <tmp>:␤Useless use of "===" in expression "{'hey' ~~ /.+/} === {'foo' ~~ /.+/}" in sink context (line 1)␤»
samcv :(
11:24 brillenfux_ left
samcv also vendethiel that also makes not much sence 11:24
=== checks if it's the same object.
maybe you want eqv?
vendethiel well, yours make sense
samcv m: ('hey' ~~ /.+/) eqv ('foo' ~~ /.+/);
camelia rakudo-moar e9487d: OUTPUT«WARNINGS for <tmp>:␤Useless use of "eqv" in expression "('hey' ~~ /.+/) eqv ('foo' ~~ /.+/)" in sink context (line 1)␤»
samcv ugh
vendethiel you need "say"
samcv m: say ('hey' ~~ /.+/) eqv ('foo' ~~ /.+/); 11:25
camelia rakudo-moar e9487d: OUTPUT«False␤»
vendethiel and I don't get to pick eqv over ===, .unique uses === so i'm stuck with that
samcv m: say ('hey' ~~ /.+/) === ('foo' ~~ /.+/);
camelia rakudo-moar e9487d: OUTPUT«True␤»
11:26 brillenfux left
samcv ah 11:26
nine m: say ('hey' ~~ /.+/).WHICH
camelia rakudo-moar e9487d: OUTPUT«Match␤»
nine That ^^^ is the reason
vendethiel well, obviously
I don't see how that's a reason tho 11:27
psch m: my $capt = \(Match.new, Match.new); say &infix:<===>.candidates.grep({ try $_(|$capt) }).say
camelia rakudo-moar e9487d: OUTPUT«(sub infix:<===> (\a, \b) { #`(Sub|65848288) ... })␤True␤»
samcv not exactly sure why it says true. since.
psch oh, double say 11:28
samcv m: IO.new === IO.new
camelia rakudo-moar e9487d: OUTPUT«WARNINGS for <tmp>:␤Useless use of "===" in expression ".new === IO.new" in sink context (line 1)␤»
samcv m: say IO.new === IO.new
camelia rakudo-moar e9487d: OUTPUT«False␤»
samcv but i guess when .new isn't called it's still the same object and not a totally 'new' one?
psch anyway, that candidate compares eqaddr || eqaddr .WHAT && eqaddr .WHICH
nine === is true if both objects have the same address (they are the same) or if both are a value type and they are considered equal (which means they have the same .WHICH output)
Match is a subclass of Capture which provices a WHICH method 11:29
FROGGS and Match is not a value type, is it?
vendethiel m: ("hey" ~~ /.+/).WHICH.say; ("foo" ~~ /.+/).WHICH.say;
camelia rakudo-moar e9487d: OUTPUT«Match␤Match␤»
samcv yeah that's what i was thinking, thanks nine
vendethiel lol
nine m: ('hey' ~~ /(.+)/) === ('foo' ~~ /(.+)/) 11:30
camelia rakudo-moar e9487d: OUTPUT«WARNINGS for <tmp>:␤Useless use of "===" in expression "('hey' ~~ /(.+)/) === ('foo' ~~ /(.+)/)" in sink context (line 1)␤»
nine m: say ('hey' ~~ /(.+)/) === ('foo' ~~ /(.+)/)
camelia rakudo-moar e9487d: OUTPUT«True␤»
psch m: say ('hey' ~~ /(.+)/) eqv ('foo' ~~ /(.+)/)
camelia rakudo-moar e9487d: OUTPUT«False␤»
vendethiel its .WHICH is always "Match", so they're always gonna be equivalent.
so you can't use .unique on a Match array
nine m: ('hey' ~~ /(.+)/).WHICH.say 11:31
camelia rakudo-moar e9487d: OUTPUT«Match|(Match)␤»
nine Not always "Match" but not helpful either :)
11:31 AlexDaniel joined
vendethiel right :p 11:31
psch m: my @a = ('hey' ~~ /(.+)/), ('ho' ~~ /(.+)/), ('hey' ~~ /(.+)/); @a .= unique: with => &infix:<eqv>; say @a 11:32
camelia rakudo-moar e9487d: OUTPUT«[「hey」␤ 0 => 「hey」 「ho」␤ 0 => 「ho」]␤»
nine FROGGS: well it could become a value type. Don't know how the decision is made if something should be a value type or not?
vendethiel m: my @a = ('hey' ~~ /.+/), ('ho' ~~ /.+/), ('hey' ~~ /.+/); @a .= unique: with => &infix:<eqv>; say @a 11:34
camelia rakudo-moar e9487d: OUTPUT«[「hey」 「ho」]␤»
11:35 domidumont joined
nine FROGGS: now that I think of it, immutability must be a key ingredient to becoming a value type and Matches are quite mutable. So no, they must not be value types. 11:36
So Match should override WHICH with the version from Mu
11:38 itaipu left 11:39 domidumont left 11:40 domidumont joined 11:50 lustlife joined 11:52 xiaomiao left 11:53 kurahaupo__ joined
vendethiel nine++ 11:55
nine Fix pushed
11:57 xiaomiao joined
nine m: say ('hey' ~~ /(.+)/) === ('foo' ~~ /(.+)/) 11:58
camelia rakudo-moar 7f26e8: OUTPUT«False␤»
MasterDuke moritz: in "putting regexes on the same level as code, allowing you to name it like subroutines", i think the "it" should be "them" 12:03
12:03 dextertzu left 12:09 khw joined
tbrowder hi, #perl6 12:12
[ptc] o/ 12:14
tbrowder I'm having trouble using the Rakudo distributions (I haven't installed the latest yet). I have installed all fine, and I can use panda to install modules. When I install zef, it installs seemingly fine, but then it's not found when I try to execute it. When I try installing it again I get a panda failure saying it's already installed. Whassup? 12:15
o/ [ptc] 12:16
12:21 lustlife left
tbrowder I've tried removing my .zef directory but that doesn't change anything. 12:21
stmuk_ just sounds like a path issue 12:22
how are you installing rakudo?
12:29 seatek left 12:33 TEttinger left 12:40 BenGoldberg joined
[ptc] stmuk_: are there still spots free at the LPW? 12:40
stmuk_ [ptc]: not sure maybe ask mdk 12:41
I suspect not since the schedule is up 12:42
[ptc] hrm, bummer 12:43
tbrowder not a path issue that I can see. All other installed modules and bins are found. On my remote servers I use the rakudo tar archive. On my local host I use the rakudo nom branch and have no problems. 12:47
12:48 wamba left 12:49 wamba joined
[ptc] stmuk_: just tried registering and it worked... I still have to work out if I can get to the UK, so I haven't confirmed the registration yet. See how I go :-) 12:49
tbrowder: how did you install zef? Via panda? 12:50
tbrowder: if you installed it via rakudobrew, it should theoretically be in your path (as far as I understand) 12:59
tbrowder it wasn't by rakudobrew, it was with the periodically-released rakudo distributions. The one I used was: rakudo-star-2016.10.tar.gz 13:05
viki tbrowder: what OS are you on? 13:06
tbrowder Opps, I just found zef. It's in $HOME/.perl6 13:07
No idea how that got there. Blowing it away and trying again...
13:08 scifi joined
tbrowder OS: Debian 8, 64-bit. 13:09
Looks like $HOME/.perl6 is created by panda, but the originally installed panda is in the dir I assigned when installing the package! 13:11
Looks like an installation disconnect but not yet sure where it occurs. 13:12
[ptc] I think panda installs into $HOME/.perl6 by default 13:13
13:13 scifi left
FROGGS I thought it would install into site if it can, not home... 13:14
tbrowder FYI, my perl 6 and friends were installed at /usr/local/rakudo.d/bin and all modules are apparently installed there. 13:15
All the bins under it are in my path.
And panda is at /usr/local/rakudo.d/share/perl6/site/bin/panda (the original installation). 13:16
I think it's way past time to use zef as the primary installer. It would help to have it as primary on travis. too. Or at least make zef a standard part of all rakudo installations. 13:18
stmuk_ [ptc]: oh I am sure you can turn up (its free and no list checking) I thought you wanted to speak! 13:25
tbrowder Okay, I'm blowing all that away and trying the non -star distro just announced: rakudo-2016.11.tar.gz 13:27
13:33 cdg joined 13:39 domidumont left 13:44 espadrine joined
stmuk_ tbrowder: rakudo-star will tell you how to set the PATH after installation 13:45
I suspect you only added the directory containing perl6 13:46
13:49 itaipu joined 13:56 cdg left 14:08 imcsk8_ left, dmaestro joined, imcsk8 joined
stmuk_ blogs.perl.org/users/steve_mynott/2...idate.html 14:10
avar sweet 14:15
dmaestro Installing now! :-) 14:25
14:32 pierre_ left 14:34 mj41 joined 14:36 mj41 left, mj41_nb joined, mj41_nb left, mj41 joined 14:37 FreezerburnV joined 14:48 jeek left 14:50 AlexDaniel left 14:54 jeek joined, jeek left 14:55 jeek joined
RabidGravy EEK! That's a new one on me "MoarVM panic: Internal error: zeroed target thread ID in work pass" 14:55
tbrowder stmuk: I added all the bin paths under the installation directory. 14:58
14:59 dextertzu joined
tbrowder and panda was there. So until today I never saw the $HOME/.perl directory. How can one install a site-wide Perl 6 that way? 14:59
Serious panda disconnect IMHO.
15:00 lucs joined 15:01 mj41 left
tbrowder Sorry, I meant the "$HOME/.perl6" directory--not seen until today. I expected all installed modules to use the dir where perl6 is found. Isn't that reasonable? 15:05
When I look at the latest zef README I see all kinds of other search and install options, including defining PERL6LIB which, I think, on the docs page is described as something not usually needed, quote: "Note that PERL6LIB is more of a developer convenience in Perl 6 (as opposed to the equivalent usage of PERL5LIB in Perl5) and shouldn't be used by module 15:08
consumers as it could be removed in the future. This is because Perl 6's module loading isn't directly compatible with operating system paths."
15:10 aindilis left, aindilis joined, canopus left
tbrowder And panda instructions don't mention $HOME/.perl6. 15:11
15:16 canopus joined 15:19 FreezerburnV left 15:32 pierre_ joined 15:37 pierre_ left
moritz stmuk_: should I try to change the date format in the RSS feed? 15:49
according to stackoverflow.com/questions/1199325...ed-pubdate it looks correct, except that it misses time zone information 15:50
dmaestro tbrowder: Coming from a deep perl5 background, and only recently devoting attention to perl6, I am so far confused by the installation rules. I wonder if someone has published an article to summarize the philosophy and how to work with it. Maybe an Advent article is coming? 15:53
15:56 bstamour joined
[ptc] stmuk_: I'll hopefully give a talk at a workshop one day; haven't really got much to talk about, well not yet 15:56
tbrowder dmaestro: I hope so, that would be a good subject. Since I don't have any other users on my servers, installation from rakudo nom branch on my main local host serves me well, but I want an easier path for current installation on my remote servers if possible, and a root installation should be a priority if we want to ease the transition of programming shops 15:57
to Perl 6.
bstamour I'm trying to overload the less-than operator for a custom class, but rakudo doesn't seem to like the definition multi sub infix:<<>(Point $x, Point $y) ...
Is there something I'm missing? :-)
psch bstamour: longest token matching means that the parser cannot know that you don't want double-< as your quote delimiter 15:58
moritz sub infix:«<»
tbrowder Anyone interested in a CGI::Lite module with a subset of Perl 5 CGI functionality?
psch bstamour: you can use infix:['<'] instead, among others
bstamour Okay.
Is the ['op'] syntax valid for any operator? i.e. it behaves kinda like hash access?
psch well, it's not gonna work for the q// operator for 'literal strings' :) 15:59
bstamour haha, fair enough.
16:00 cygx joined
bstamour imagine doing multi sub infix:q:x'some unix command'(...) lol 16:00
cygx m: sub infix:<\<>($a,$b) { say $a+$b }; 1 < 2
camelia rakudo-moar 939d27: OUTPUT«3␤»
cygx ^ yet another variant
psch m: constant \opname = '*'; say &infix:[opname](2,3)
camelia rakudo-moar 939d27: OUTPUT«6␤»
bstamour this language is nuts. but in a good way. 16:01
stmuk_ moritz: It looks like a bug in perlanet .. your blog on its own is treated correctly
moritz: your blog and another works too ... just not when I add all of them
16:09 domidumont joined 16:16 mr-foobar joined
moritz :( 16:16
16:18 Sgeo left
stmuk_ I'm perlbrewing a parallel setup in the hope updating modules might help 16:18
16:19 Herby_ joined
Herby_ o/ 16:19
moritz stmuk_: thanks for looking into it
\o Herby_
Herby_ I've looked but can't find this... if I want to create my own package MyFunctions, where do I save that .pm6 file? 16:21
i havent seen that in any of the perl6intro articles (possible I've overlooked it) 16:22
moritz Herby_: typically in lib/, and then you do a 'use lib "lib";'
Herby_: or run your script with perl6 -Ilib ... 16:23
(or install it using panda or something like that)
Herby_ hmm. where do you save your .pm6 files that contain classes etc.. for your projects? 16:24
same place?
moritz yes
16:24 cibs left
Herby_ gotcha. ok, I'll give it a whirl 16:25
and I'm looking forward to that book you're writing :)
16:26 cibs joined
moritz too :-) 16:31
16:34 pierre_ joined 16:35 trnh joined, trnh left, trnh joined 16:38 pierre_ left
stevieb moritz: if I'm not mistaken, you had a sign-up to be notified when the book comes out, yes? (if so, I'm on it, it's just I don't remember stuff as well as I used to ;) 16:44
16:46 trnh left 16:49 trnh joined, trnh left, trnh joined
stmuk_ moritz: is it possible to put published or updated elements in your feed? 16:52
moritz stevieb: yes, I hav a mailing list (signup form at perl6book.com/#signup ) 16:54
stmuk_: I don't udnerstand the question; isn't that what the feed is made of?
stmuk_ I just see <pubDate>Sun, Nov 20 00:00:00 2016</pubDate> 16:55
moritz yes, that's because I generally only store the publishing date, not the time 16:56
stmuk_ perlanet is not parsing the date correctly
moritz so what would be correct?
stmuk_ not sure .. you could try 01:00:00 or adding extra elements like 'published' or 'updated' or whatever 16:58
moritz but how is 01:00:00 a more valid time than 00:00:00? 16:59
stmuk_ maybe the code is buggy and doesn't handle that case 17:00
moritz I'll add a second and see if it makes a difference 17:01
stmuk_: ok, perlgeek.de/blog-en/perl-6/index.rss now says <pubDate>Sun, Nov 20 00:00:01 2016</pubDate> 17:02
stmuk_ makes no difference :( 17:03
it still sees no publish date and so bumps your post right to the bottom of the feed (which usually means its not displayed)
moritz stmuk_: should I try to add a time zone?
stmuk_ yeah any tweaking of the format might help 17:04
its easy to reproduce with libperlanet-perl in debian
moritz <pubDate>Sun, Nov 20 00:00:01 2016 CET</pubDate> 17:05
stmuk_ nothing I'm seeing no dates 17:06
moritz stmuk_: what command and config files do you use? 17:07
stmuk_ github.com/stmuk/pl6anet.org 17:08
I've been slack in updating but the config is close to that 17:09
/usr/bin/perl /usr/bin/perlanet perlanetrc
17:10 skids joined
stmuk_ bbl 17:11
17:15 Sgeo joined 17:16 trnh left 17:18 mj41 joined 17:19 trnh joined, trnh left, trnh joined 17:31 mj41 left
moritz I've /msg'ed davorg on magnet and asked for some hints on how to debug that 17:33
El_Che moritz: great news about the book 17:41
mspo Learnyousomeperl6? 17:42
17:45 raiph left
moritz mspo: perlgeek.de/blog-en/perl-6/2016-book.html 17:47
17:48 trnh left
viki moritz: FWIW, <pubDate>Thu, 29 Sep 2016 00:00:00 +0000</pubDate> works 17:50
moritz viki: I'll try that, thanks
17:51 trnh joined
viki m: use NativeCall; sub strftime (Str) is native {}; say strftime "%a, %d %b %Y %H:%M:%S %z" 17:52
camelia rakudo-moar 939d27: OUTPUT«(signal SEGV)»
moritz doesn't look like it works :(
viki moritz: then the issue is not the date. Perl6.Party uses that date format
17:53 mohae joined
viki moritz: and I generate feed XML by hand: github.com/zoffixznet/perl6.party/...pl#L65-L77 17:53
moritz viki: I'm increasingly worried that blosxom actually produces a nasty mixture of RSS and Atom, and somehow complete messes up
17:54 lizmat_ joined
moritz if you look at view-source:perlgeek.de/blog-en/perl-6/index.rss it has <rdf:RDF> as the outer-most element, where all the other examples use <rss> 17:54
17:55 emdashcomma left, garu left, PerlJam left, Bucciarati left
moritz or <channel>, that is 17:55
17:56 lizmat left, garu joined, Bucciarati joined, masak joined, PerlJam joined, masak is now known as Guest42062 17:57 emdashcomma joined 18:01 pierre_ joined 18:07 chee left 18:12 pierre_ left 18:13 trnh left 18:19 Lucas_One left 18:20 trnh joined 18:22 chee joined 18:24 Lucas_One joined 18:31 trnh left
stmuk_ "Blosxom, produces a pubDate field that is not RFC822 compliant " 18:32
18:40 trnh joined 18:53 xinming left 18:55 espadrine left 18:58 bpmedley left 19:01 bpmedley joined 19:04 bpmedley left, inventiv1 joined 19:05 bpmedley joined 19:08 darutoko left 19:10 cygx left 19:11 inventiv1 left 19:13 Tonik joined
bstamour Is tnere any way to express "every item in this array must have the same type" in a type signature? 19:21
19:22 eisen74 joined
bstamour Or is that only expressible via constraints? like "where ..."? 19:22
psch bstamour: you can also declare a nominally typed Array
lizmat_ my Int @a 19:23
19:23 lizmat_ is now known as lizmat
bstamour does that work in signatures too? like sub foo(Int @x) ? 19:23
psch m: sub f(Int @a) { say [+] @a }; my Int @a = ^10; say f @a
camelia rakudo-moar 939d27: OUTPUT«45␤True␤»
lizmat bstamour: alas, no 19:24
bstamour darn
psch huh?
FROGGS it does work as shown, or not? 19:26
m: sub f(Int @a) { say [+] @a }; my @a = 1, 2, 'test'; say f @a 19:27
camelia rakudo-moar 939d27: OUTPUT«Type check failed in binding to @a; expected Positional[Int] but got Array ($[1, 2, "test"])␤ in sub f at <tmp> line 1␤ in block <unit> at <tmp> line 1␤␤»
19:28 xinming joined, AlexDaniel joined 19:29 Skarsnik joined 19:44 bstamour left 19:51 cygx joined 19:52 cygx left
lizmat m: m: sub f(Int @a) { say [+] @a }; my @a = 1, 2, 3; say f @a 19:55
camelia rakudo-moar 939d27: OUTPUT«Type check failed in binding to @a; expected Positional[Int] but got Array ($[1, 2, 3])␤ in sub f at <tmp> line 1␤ in block <unit> at <tmp> line 1␤␤»
lizmat FROGGS: even if they are all Int, it fails
it *always* fails
m: m: sub f(Int @a) { say [+] @a }; my Int @a = 1, 2, 3; say f @a
camelia rakudo-moar 939d27: OUTPUT«6␤True␤»
lizmat ah
psch m: sub f(@a where .of =:= Int) { [+] @a }; my Int @a = 1,2,3; say f @a 19:57
camelia rakudo-moar 939d27: OUTPUT«6␤»
psch that's kinda-sorta-probably what we're doing under the hood, isn't it 19:58
lizmat psch: yeah, think so 19:59
arnsholt There's a jnthn quote here: Types in Perl 6 are nominal, not structural
That is, it's how you *declare* a type that matters, not what it looks like 20:00
psch well, nominal is somehow related to latin "nomen", which means "name", hence my mnemonic is "what you call them"... :) 20:01
arnsholt Yup!
20:05 perigrin left, perigrin joined, perigrin left 20:06 perigrin joined, BenGoldberg left 20:07 ribasushi left
timotimo lizmat: would you be interested in discussing how views ought to work in moar and rakudo? 20:07
i.e. partial- or higher-dimensional slices of nd arrays
20:10 aindilis left, trnh left
lizmat timotimo: sure 20:12
20:12 wamba left
timotimo so right now i've got not quite working yet prototype 20:12
20:12 wamba joined
timotimo a view into an ndarray will have a starting index, and for each of its "own" dimensions an offset by which to increase (or decrease) the item index for each step in any of the dimensions 20:14
20:15 wamba left
timotimo so i'd be offering ops to get/set these "strides", and also the initial offset (for making things like reversing items across one dimension for example)and also to get/set the target of a view 20:16
lizmat sounds ok so far: I assume a stride can be 0, right ?
timotimo it can be, if you'd like 20:17
that way you can implement a dimension that'll give you the same actual item for every index you pass
(give, as in read-write, of course)
lizmat yup
sounds sane to me so far :) 20:18
20:19 domidumont left
timotimo OK 20:20
some other things you'll be able to do is shuffle dimensions around
for example, if we want to support fortran's style of indexes we can just .reverse the strides list 20:21
20:21 domidumont joined
timotimo i have no idea yet how the user should be able to specify those more complicated situations 20:21
lizmat timotimo: we'll figure it out somehow :) 20:22
20:22 rindolf left
lizmat not sure what you mean with fortran style of indexes... you mean starting at 1 instead of 0 ? 20:22
20:22 trnh joined, trnh left, trnh joined 20:23 domidumont left
timotimo oh, no 20:23
that's lua
arnsholt Row-major versus column-major
timotimo yes
in C, you'd get the same thing from foo[1][2][3] that you'd have to spell foo[3][2][1] in fortran 20:24
20:24 Guest42062 is now known as masak
arnsholt Fortran indexes down, where C indexes across 20:24
lizmat ok
20:25 rindolf joined
masak sounds like little-endian/big-endian but for array dimensions 20:25
timotimo i suppose a .reshape method on ndarrays would definitely be good 20:26
that way we'd turn a 9-element one-dim array into a 3x3 two-dimmed array, for example
lizmat timotimo: wouldn't you want that to be a view ? 20:27
timotimo also, we'll of course support views that expose fewer elements than the target has, for example if we slice in one dimension
yes, a view
lizmat ok, *phew* :-) 20:28
timotimo sory, i potentially won't be proper with these words
lizmat turning a 3x3 into a flat would be nice when copying between two shaped arrays
timotimo sure, that also ought to be possible
20:28 trnh left
timotimo easily 20:28
20:29 wamba joined
timotimo how do we expose things like "i want to index every second element in this dimension" to the user? 20:29
clearly the most intuitive thing would be 0,2...*, but we can't easily introspect that 20:30
20:31 mj41 joined
lizmat well, doesn't a sequence know its adding a value each step, or multiplying? 20:32
pretty sure a sequence "knows" it's adding 2 every step there 20:33
and that it starts at 0
20:33 cooper_ left
lizmat maybe we can't introspect that at the moment... but the info is there somewhere :-) 20:33
20:34 setty1 left 20:35 TEttinger joined 20:37 kurahaupo__ left
lizmat stmuk: re announcement github.com/rakudo/star/blob/master...2016.11.md , there are several mentions of infix:<foo> that miss the <foo> because it looks like an HTML tag 20:41
stmuk: not sure if this is a rendering issue or not or how to fix
20:42 trnh joined
El_Che lizmat: when are you announcing the new rakudo release? 20:43
lizmat well, if it's release tomorrow before the P6W, I'll mention it there
but that's really up to stmuk_ :-)
El_Che I mean the regular one, not the star
I'll try to build the rakudo linux packages tomorrow during the day 20:44
lizmat ah, well, *that's* up to Zoffix I think
El_Che ok 20:45
moritz lizmat: it would be nice if you could mention my latest two blog posts on the next p6weekly. Thanks!
lizmat moritz: I will :-) 20:46
20:49 ribasushi joined 20:51 trnh left, FROGGS left 20:56 Ven joined 20:57 trnh joined
dmaestro The issue I am trying to deal with now is, what is the (undocumented?) %*CUSTOM_LIB dynamic variable? I tried running ufo and got this error: Dynamic variable %*CUSTOM_LIB not found in sub get_prefix 20:57
timotimo lizmat: well, as long as we can ensure that nobody goes around making sequences that pretend to be "start at x, add n each step, end at k" but really are something entirely different
people shouldn't rely on that working, of course 20:58
dmaestro: i don't think ufo is needed at all any more
lizmat: oh, btw, i'm also going to support viewing an int32 as an int8 for example 20:59
lizmat timotimo: that would not be a "standard" sequence, and as such unacceptable for this type of thing :-)
20:59 skink joined
dmaestro timotimo: trying to install Readline is failing on my older linux box without libreadline.so.6 (I have version 5). I thought I'd try to 'look', reverse a breaking change and install manuall, but I don't know how to do that. 21:00
Can panda (or zef) help with that? 21:01
I'd also like to know what the current status of %*CUSTOM_LIB is, pointers to docs/articles on what it is for, or replaced by. 21:02
timotimo the last mention of CUSTOM_LIB is 12 months old
skink I've got a nativesub(uint64, uint64) that errors 'Native call expected argument that references a native integer, but got P6opaque' when I pass it (Int, Int) 21:03
timotimo | +### What about `%?CUSTOM_LIB`?
| +
| +Probably also gone, though probably also partly covered by whatever we build
| +to satisfy the previous question.
skink: int can't handle undefinedness, so you'd have to pass actual numbers there 21:04
skink How do you mean?
lizmat m: say my Int $a; say my int $a 21:05
camelia rakudo-moar 486155: OUTPUT«Potential difficulties:␤ Redeclaration of symbol '$a'␤ at <tmp>:1␤ ------> 3say my Int $a; say my int $a7⏏5<EOL>␤0␤0␤»
lizmat m: say my Int $; say my int $
camelia rakudo-moar 486155: OUTPUT«(Int)␤0␤»
geekosaur how do you put undefined in a machine register?
native types are what the hardware does
timotimo dmaestro: is the readme of Readline telling you to use ufo to install it?
skink Lemme clarify: when I generate the uint64s I need within a given scope and pass them it works, but I'm loading those numbers into a hash table, where they apparently get auto-converted to Int 21:06
dmaestro I believe that's where I saw it, yes.
21:06 Tonik left
skink So it works... and then it stops working :) 21:06
timotimo ah, it does tell you to do that
that portion of the readme has last been touched in march of last year
i.e. 3/4 of a year before our first stable release :S
geekosaur you can type a hash with uint64 values, I think. but even with the default, you should be able to use a coercion uint64(value)
I think 21:07
timotimo anyway, you're meant to just install it with panda install . or zef install .
or panda install Readline or zef install Readline
skink Tried coerce and got an error
timotimo we don't have uint64(value)
dmaestro But when it breaks, and I want to patch the code locally? I don't know how to build/install it after I patch it?
timotimo you should be able to "(my uint64 $ = $value)"
dmaestro: then just panda install . inside the folder 21:08
dmaestro timotimo: Thanks, that's probably what I was looking for :-)
skink foo((my uint64 $ = $x), (my uint64 $ = $y)) gives me 'expected argument that references a native integer, but got P6int' 21:10
timotimo dmaestro: have you seen this? github.com/drforr/perl6-readline/issues/12 21:11
skink Wait... I may be dumb... 21:13
timotimo skink: it does sound like you're meant to pass a read-writable int value 21:14
even though you said the function is declared to take (uint64, uint64) rather than (uint64 is rw, uint64 is rw) 21:15
21:15 itaipu left
skink Yep, that's why I was dumb :) 21:15
I had copy-pasted a previous def and modified it, forgetting to take out is rw
timotimo i think the error message ought to have "rw" somewhere in it 21:16
21:17 itaipu joined 21:20 trnh left 21:23 perigrin left 21:25 perigrin joined 21:26 zakharyas joined, Herby_ left 21:28 lizmat_ joined 21:31 lizmat left 21:34 trnh joined, trnh left, trnh joined 21:37 dextertzu left, xinming left, dextertzu joined
dmaestro timotimo: Thanks, that's a helpful reference - I had already looked at the source history, so I tried changing the version # to match my system. I'm now getting an invalid symbol error, which points to probably have to upgrade my library somehow. 21:40
geekosaur which symbol?
dmaestro My only wonder now is why it used to work circa rakudo-star 2016.07
geekosaur: 0000000000000000 D *UND* 0000000000000000 PC 21:41
timotimo don't you mean downgrade the library?
dmaestro I'm on an old slackware Linux with readline 5, not 6 or 7. Upgrade to 6 would be in order, but I'm curious about the nature of the incompatibility. 21:42
21:42 xinming joined
dmaestro Not really upgrade, either, of course, just add the later version to be available. 21:43
timotimo you can just use Linenoise instead 21:45
it builds its library by itself, if i'm not mistaken 21:46
geekosaur ok, some googling tells me that your libncurses changed, and n longer incorporates libtinfo the same way 21:47
21:47 setty1 joined
geekosaur you may need to add an explicit link of -lncurses and/or -ltinfo 21:48
21:48 bjz left, Skarsnik left
moritz stmuk_: I've fiddled a bit with the RSS format; now my local installation of perlanet detects some timestamps 21:49
21:49 firstdayonthejob left 21:50 BenGoldberg joined 21:51 xinming left 21:52 ribasushi left
BenGoldberg m: m: sub f(Int @a) { say [+] @a }; my Int @a = 1, 2, 3; say f @a 21:53
camelia rakudo-moar f25ab3: OUTPUT«6␤True␤»
BenGoldberg m: m: sub f(Int @a) { say [+] @a }; my Buf[Int] $a = 1, 2, 3; say f $a 21:54
camelia rakudo-moar f25ab3: OUTPUT«5===SORRY!5=== Error while compiling <tmp>␤Calling f(Buf[Int]) will never work with declared signature (Int @a)␤at <tmp>:1␤------> 3[+] @a }; my Buf[Int] $a = 1, 2, 3; say 7⏏5f $a␤»
BenGoldberg m: m: sub f(Int @a) { say [+] @a }; my Buf[Int] $a = 1, 2, 3; say f @$a
camelia rakudo-moar f25ab3: OUTPUT«WARNINGS for <tmp>:␤Useless use of constant integer 2 in sink context (lines 1, 1)␤Useless use of constant integer 3 in sink context (lines 1, 1)␤Type check failed in assignment to $a; expected Buf[Int] but got Int (1)␤ in block <unit> at <tmp> li…»
21:56 eyck left 22:03 firstdayonthejob joined 22:08 bjz joined 22:10 FreezerburnV joined 22:12 eyck joined 22:13 FreezerburnV left 22:14 FreezerburnV joined, bjz left 22:16 FreezerburnV left, bjz joined 22:18 Raimondi joined 22:21 FreezerburnV joined, lizmat_ is now known as lizmat 22:22 bjz left, firstdayonthejob left 22:24 rindolf left, ribasushi joined 22:28 Ven left, dextertzu left 22:31 seatek joined, beatdown left 22:39 firstdayonthejob joined 22:46 FreezerburnV left 22:47 Sgeo_ joined 22:49 Sgeo left 22:52 RabidGravy left 22:54 vendethiel left
viki W00t! I made delicious Perl 6 cookies \o/ pbs.twimg.com/media/CxvZ0cQW8AAOm2E.jpg:large 23:00
>:)
seatek mmm :) 23:02
AlexDaniel one on the right is like
23:03 grondilu_ joined 23:04 grondilu_ left, itaipu left
dmaestro Building libreadline on my system leaves undefined symbols in the shared libraries that Readline can't seem to handle. 23:05
I've tried the builtin libreadline.so.5 and a newly-compiled libreadline.so.6, and neither one will load. 23:06
23:06 grondilu left
dmaestro Symbols: UP PC BC 23:07
So I'm taking timotimo's suggestion to install Linenoise. 23:08
23:08 zakharyas left, grondilu joined
dmaestro And Linenoise works fine, where Readline didn't 23:09
23:13 itaipu joined 23:28 mj41 left, xinming joined
BenGoldberg viki, If the cookie on the left has peanut butter chips, I'll have that one. 23:34
23:38 xinming left 23:39 xinming joined 23:40 firstdayonthejob left
viki BenGoldberg: sadly, I already ate all of them :) 23:42
23:44 Actualeyes joined
seatek i was hoping those were butterscotch :) 23:57
23:58 dextertzu joined
skink What's the trick to get MAIN() to take an array? 23:59
A list of paths, specifically