6.2.11 released! | pugs.blogs.com | pugscode.org | pugs.kwiki.org | paste: sial.org/pbot/perl6 Set by wolverian on 12 February 2006. |
|||
00:11
jiing joined
00:13
jiing joined
00:14
feng joined,
feng left
00:15
jiing__ joined
00:18
avar joined
|
|||
svnbot6 | r9048 | putter++ | regexp_engine_demo.pl - exploring backtracking api. | 00:18 | |
00:50
avar joined
01:04
theorbtwo joined,
pdcawley joined
01:08
lao joined
01:40
orafu joined
01:51
joepurl joined
01:56
Khisanth joined
02:23
Limbic_Region joined
02:30
xern joined
|
|||
svnbot6 | r9049 | Darren_Duncan++ | r2519@darren-duncans-power-mac-g4: darrenduncan | 2006-02-17 18:41:13 -0800 | 02:43 | |
r9049 | Darren_Duncan++ | ext/Locale-KeyedText/ : resynced KeyedText.pm version num with the perl 5 edition | |||
02:51
justatheory joined
03:02
Limbic_Region left
03:06
hcarty joined
03:10
Cryptic_K joined
03:21
gugod joined
03:23
beppu joined
03:55
hcarty left
04:19
Amnesiac joined
04:54
justatheory joined
05:08
putter joined
05:11
justatheory joined
05:46
kanru joined
|
|||
gaal | azuroth: given ($object) { ... }, I think, does what you want | 05:50 | |
arcady | what's the difference between { temp $_ = $object; ... } and { my $_ = $object; ... } ? | 06:02 | |
buu | arcady: One involves the collapse of miniature black holes. | 06:03 | |
06:04
drbean joined
|
|||
arcady | oh, well then everything is perfectly clear : ) | 06:04 | |
06:04
Nouk joined
06:08
Gniij is now known as jiing
06:14
feng joined
07:14
beppu joined
07:25
scook0 joined
08:24
iblechbot joined
09:15
ghenry joined
09:24
ghenry left
10:16
Alias_ joined
|
|||
Alias_ | audreyt: ping? | 10:17 | |
10:18
chris2 joined
10:45
bsb joined
11:03
elmex joined
11:28
larsen joined
11:42
kisu joined
11:43
pdcawley joined
12:01
iblechbot joined
12:08
pdcawley joined
12:20
larsen_ joined
12:45
chris2 joined
12:51
avar joined
13:01
marmic joined
13:23
SamB joined
13:27
avar joined
13:34
rantanplan_ joined
13:39
rantanplan_ joined
14:36
avar joined
14:41
scw joined
14:58
avar joined
15:15
feng123 joined
|
|||
avar | mm | 15:16 | |
has there been any discussion on negative imports in Perl 6? | 15:17 | ||
like some shorthand for: | |||
use warnings; | |||
no warnings 'qw'; | |||
use warnings '!qw'; or something | |||
Alias_ | that works in Perl 5... so I'm sure there's be an equivalent | ||
unimport | |||
avar | yeah, I know it works, but I was wondering about whether there had been any discussion on a shorthand syntax | 15:18 | |
Alias_ | ah | ||
Well, the import params are module-specific | |||
So I imagine it will be very similar | |||
gaal | import syntax isn't finalized, so i don't think unimport shortcuts can be :) | ||
Alias_ | and it isn't really unimport anyway | ||
There's import, and then there's lexical pragma-like stuff | 15:19 | ||
In P5 they are the same, I think the two were being split out or something | |||
gaal | way I see it, there's import and module config requests. there was a good discussion about this here on the channel sometime, and a few attempts on p6l, but no resolution | 15:25 | |
avar | how is EXPR for EXPR parsed internally? | 15:30 | |
because it's not turned into for EXPR <BLOCK>EXPR</BLOCK> | |||
since print $i for my $i 0 .. 5; doesn't work | 15:31 | ||
Alias_ | gaal: Right | 15:32 | |
gaal: imports suck anyway for most OO code, since they pollute APIs | |||
at least in the Perl 6 symbol table style of imports anyway | 15:33 | ||
err Perl 5 symbol table style | |||
16:03
putter joined
|
|||
svnbot6 | r9050 | audreyt++ | * Pugs.CodeGen.YAML: "pugs -CParse-YAML" now omits the primitive | 16:05 | |
r9050 | audreyt++ | bindings for functions and types, just as "pugs -CPugs" used to do. | |||
putter | gaal: re imports, if you have any dreams of how they would ideally work, and be expressed, I'd be interested. | 16:08 | |
in case anyone is curious, my current state is: i think i'm starting to get a handle on the whole regex (and parsing, i think) picture. (ask me questions, please!:) and there's _no_ way i'm coding it all by hand. so i've just started a meta-programming exercise, so i can keep all the info in one place, and autogrovel out p5/p6 ast and engine code for p5/p6 regexs. commits when things settle down a bit more. | 16:15 | ||
my surprise for yesterday was just how close p5 is to having rules already, with ast macros as subs, in the character class sublanguage (user-defined unicode properties), and string macros in the... need a name for it... top-level regex language (overload and customre). it kind of looks like the only reason p5 regex couldn't gracefully | 16:19 | ||
evolve into p6 rules is the p5 engine's intolerance of reentrancy. but for that, we could have had rules years ago. sigh. | 16:20 | ||
audreyt | damian found that out in 2003. sigh. | ||
audreyt mumbles something insane: "switch to pcre" | |||
putter | did anyone ever consider swapping out the regexp engine? or adding a second one (pragma'ed)? | 16:21 | |
16:22
cognominal joined
|
|||
gaal | putter: you were part of that discussion and I remember you had some valuable input... I'll bring this up in the 'thon | 16:22 | |
audreyt | putter: yes, I think mjd and ilyaz had both coded something toward that | 16:23 | |
putter | re the meta-programming, i'm trying to do a "whole spec" massage. so my hope is, when it runs (maybe a week out?), it will actually be feature complete, and perhaps even resemble correct. we'll see. | ||
gaal: that would be great, thanks. | 16:26 | ||
(hmm, so in an alternate universe, where the p5 engine was reentrant early on, "it can parse anything easily" was a property of perl 5.something, rather than p6. instead of mere Inline, complete compilers. instead of multi-year p6 discontinuity, years of moduled sourcefilter+rules-based experimentation, and incremental language evolution. sigh indeed.;) | 16:34 | ||
audreyt | putter: that's the theme of my CUFP article ;) | 16:36 | |
though dconway/allison remarked "perl6-rules on perl5-regex was never the plan, just a spike" | 16:37 | ||
but had the p5rx engine be reentrant, the spike will had likely evolved, instead of broken on perl 5.8.3 and never picked up again | |||
16:39
bsb joined
|
|||
putter | neat. no comment. agreed. putter goes to read docs/talks/cufp2005.txt . | 16:40 | |
audreyt | putter: er, see docs/talks/hw2005.tex instead | 16:41 | |
putter | thanks :) have read both, but rereading is fun/useful. | 16:44 | |
re dynamic grammars, turns out "once upon a time" languages with custom grammars were actually common. | 16:45 | ||
died out because they were a maintenance nightmare. each file/program has it's own syntax. | 16:46 | ||
I think a key characteristic / distinction from p6, is they were not (easily?) customizable enough to do other, standardized languages. eg, couldn't customize all the way to a fortran or lisp. so custom == random author whims. rather than == ability to use well designed and documented other languages. | 16:48 | ||
hmm, also , the lack of a cpan / ability to share ideas, and focus in on good ones, meant "each author has his own language, with only bacterial code sharing". | 16:49 | ||
"bacterial code sharing" == pick up bits of code from those you bump into, and add them to your own set. | 16:50 | ||
p6 flexibility _will_ have challenges, and it will seem strange to folks, and some will remember flexibility's earlier failures, so something to think/talk about. | 16:51 | ||
audreyt | nod. | ||
putter | (all this because putter noticed the sentence in hw2005.tex "Unlike most languages, Perl 5 has a dynamic grammar...":) | 16:52 | |
Alias_ | sigh... pcre... | 16:53 | |
putter: I seem to recall hearing smalltalk discussed like that | 16:54 | ||
"It will take me 3 weeks to code up a suitable set of environment $stuff, but after that we'll progress fast" | |||
svnbot6 | r9051 | gaal++ | * DrIFT.YAML and DrIFT.RuleYAML: better error handling for unrecognized | ||
r9051 | gaal++ | nodes in derived instances | |||
r9051 | gaal++ | * Derive instances for the DrIFTless | |||
Alias_ | putter: And I believe you bacterial thing has a name. Something like "horozontal evolution" | 16:55 | |
your | |||
putter | Alias_: ooo, interesting. i wonder if we could get an "if only we had cpan" quote from one of the smalltalk old-timers like Alan Kay... | ||
Alias_ | Interestingly, I find JavaScript the same way | 16:56 | |
putter googles... | |||
Alias_ | Not at a grammar level, but at a "first you make your tools" | ||
Which might help explain why Prototype is so inscrutable | |||
:) | |||
audreyt: A couple of very quick YAML::Syck question | |||
? | |||
As it related | 16:57 | ||
Specifically, your Module::Install Makefile.PL for it | |||
16:57
justatheory joined
|
|||
audreyt | ...yes? | 16:57 | |
Alias_ | I've had 5 people in the last week ask how to do XS in M:I | ||
So I figure it needs to be documented properly, and YAML::Syck is the only example I know of | 16:58 | ||
svnbot6 | r9052 | gaal++ | * Pugs.Prim - add Pugs::Internals::eval_p6y, a conjectural and | ||
r9052 | gaal++ | probably bogosous prim to load precompiled Perl 6 files. | |||
Alias_ | Can you explain what you are doing in it briefly? | ||
audreyt | inc_paths sets the INC paths | ||
c_file sets the C files | |||
Alias_ | why the use lib '.'? | ||
audreyt | optimize_flags sets theoptimization flags | ||
Alias_ | And why is inc_paths needed | 16:59 | |
audreyt | use lib is not needed | ||
putter | Alias_: re horiz ev, yes, thanks. (as long as one stays away from creationists, which seem to have their own take on this, as on so much else;) | ||
svnbot6 | r9053 | gaal++ | * The Prelude is now precompiled into YAML. | ||
audreyt | you can take it off | ||
Alias_ | ok | ||
audreyt | inc_paths is needed becaus syck.h is in . | ||
gaal++ gaal++ gaal++ # 3-day non-stop hacking | |||
Alias_ | So it refers to the location of the headers? Because the header search is done in the @INC? | ||
gaal | the next one's the nice one :) | 17:00 | |
audreyt | Alias_: it's not done in the @INC | ||
putter | "bogosous" *grin* | ||
audreyt | inc_paths refers to C's "INC" | ||
not perl's @INC | |||
Alias_ | uuum, oh dear | ||
audreyt | I admit it to be ambiguous. | ||
c_inc_paths? | |||
header_paths? | |||
Alias_ | I have some ideas, I'll deal | ||
putter | gaal++ woot | ||
audreyt | k | ||
Alias_ | (and leave the current one for now) | ||
gaal | audreyt++ audreyt++ audreyt++ # nonstop mental-and-I-mean-mental support :) | ||
Alias_ | can_cc I've already improved | 17:01 | |
audreyt | mm I'm feeling mental | ||
cool | |||
Alias_ | explain c_files | ||
gaal | whoops, "next one" was actually 9053 | ||
Alias_ | According to someone else, it's a bit weird | ||
Because you set c_files( 'foo.c' ) if there's a file 'foo.xs' | |||
Or something | |||
gaal | plus profound hackerosity magic and generic^Wall-around wonderosity coolage, etc. :) | 17:02 | |
putter | lol; audreyt++ ;) | ||
gaal | so, now, just to make it not slow, TWD etc. | ||
audreyt | Alias_: I think c_files should accept .xs and translate them into .c | 17:03 | |
putter | so this putter around the planet thing seems to work.. ;) | ||
17:03
Maddingue joined
|
|||
gaal remakes an optimized build. | 17:03 | ||
audreyt | c_files glob("*.c"), glob("*.xs") | ||
putter | err, audreyt-ing around the planet... | ||
audreyt | putter: I'm thinking about relaxing my self-imposed US ban | ||
just so I can come to Chicago and Portland. | |||
and Seattle. | |||
(and where stevan is at, now that he did not secure a TPF grant to .jp) | 17:04 | ||
where is stevan located anyway? | |||
putter avoids flying where possible. security idiocy was the only thing i didn't like about flying _before_ 2001. now it's just silly. | |||
Alias_ | Entering the US sucked | 17:05 | |
audreyt | it looks like YAPC::NA this year will rock, though. | ||
Alias_ | And I'm from a friendly country dammit | ||
audreyt: I may not be going :/ | |||
putter | stevan is in Conneticut. ok, no chance of spelling that right without checking. a couple of hours from boston. | ||
audreyt | yeah, I'm from a minion country too | ||
ah, on the other end of the country | 17:06 | ||
gaal | putter: consider donating to alt.pave.the.earth so you can take a train anywhere! | ||
Alias_ | audreyt: World Cup is on at the same time as YAPC::NA and AU is going for the first time in 35 years | ||
audreyt | Alias_: that means... what? | ||
(and world cup for which sport?) | |||
Alias_ | err "the" world cup | ||
football | |||
putter | lol | ||
Alias_ | That means how could I go somewhere where I can't find room of drunk cheering australians! | ||
putter didn't know the NFL had a world cup... ;) | 17:07 | ||
Alias_ | heh | ||
If YAPC::NA can organise drunk rooms of cheering australians, I'm there | |||
or a football mini-conf :) | |||
Anyways... c_files | 17:08 | ||
putter | seems likely :) | ||
Alias_ | Is there any reason you could just want it automated :) | ||
compile_all_c_files | |||
or line it into the inc_paths | |||
putter | back to meta-coding... | ||
Alias_ | compile_c_path '.' | ||
audreyt | Alias_: maybe... but it's unusal to put all .c into the same . | 17:09 | |
Alias_ | wouldn't it be recursive? | ||
or is that not normal too | |||
I'm kind of feeling around for the "as easy to learn as Ruby" approach | |||
(which is my new MI slogan) | |||
:) | |||
audreyt | recursive may make sense | 17:10 | |
Alias_ | so people would split it up, but #include "foo/bar.h" ? | 17:11 | |
I've never really understood C namespacing/dirs/etc | |||
audreyt | the thing is everyone does it differently | 17:12 | |
see Compress::Zlib for another example | |||
Alias_ | got any more? | ||
Even finding YAML::Syck was hard | |||
audreyt | the usual case | 17:13 | |
where it's just a .xs file | |||
requires no special declaration whatsoever | |||
it's only needed if you either include other .h/.c files | |||
Alias_ | meaning one and one only .xs file in the root dir, or something like that right? | ||
audreyt | yup | 17:15 | |
Alias_ | Is that a EUMM thing, or can we remove that? | 17:17 | |
It would be nice to keep things declarative an d predictable, rather than magic :) | |||
audreyt | it's a EUMM thing, though I'd argue it should Just Work much like .pm files | 17:18 | |
Alias_ nods | |||
audreyt | (I may need to run for dinner soonish) | ||
Alias_ | cc/stuff | ||
or something | |||
So, something like cc_autocompile '.' | |||
although that reads wrong | |||
cc_build '.' ? | 17:19 | ||
which would be cc_inc_paths + File::Find and add all .c and .xs | |||
audreyt | that sounds good | ||
Alias_ | And I'd like to rename c_files to cc_c_files, but it's not as important as inc_path | 17:20 | |
it also looks wrong :) | |||
17:27
pdcawley joined,
calanya joined
17:28
kisu joined
17:52
justatheory joined
|
|||
rafl | audreyt: Do you already know if you can come to GPW? | 17:52 | |
Alias_ | hmm, I just realised an amazing feature of Module::Install | 18:01 | |
It allows you to deprecate old features really really quickly :) | |||
(in relative terms) | |||
18:04
Amnesiac joined
|
|||
putter | Alias_: how so? | 18:08 | |
Alias_ | Well, because it doesn't matter what the end user has, and only what the author has, it means a relatively much smaller number of people need to adapt | 18:09 | |
And authors are generally much smarter and easier to control | 18:10 | ||
putter | ah :) | ||
Alias_ | So if I replace c_files with a die "Deprecated, use cc_c_file" I can skip the whole "keep it" and "keep it, but warn" stages | ||
putter | got it. a nice property. | 18:15 | |
wonder how more things could be made to have it...? | |||
Alias_ | heh | ||
not many | |||
I suspect it's a particular property of installers | |||
Bundling redundant extra code with you is a positive in that case | |||
putter | hmm.. though in p6, you can request particular flavors of module... i don't remember if foobar-joe-1.30 and foobar-bob-0.05 modules can coexist at runtime... i think so... | 18:19 | |
Alias_ | yes | ||
C/C# style versioning | |||
obra | putter: larry put this in the synopsis. | 18:20 | |
putter | err, "C style versioning"? ;) | ||
obra: ah, great. tnx | |||
hmm. foobar-1.3.0-joe. different order, hmm... I imagine one might end up saying a lot of use Something-(Any)-joe. because joe and bob have entirely unconnected concepts of what the name "Something" applies to. the hierarchy looks like authority-name-version, but it's been shuffled to optimize for the "agreement on name" case. | 18:26 | ||
18:47
orafu joined
|
|||
putter | It could be nice to have an "annotated" p6 spec. which not only said what's what, but also described the thinking behind it. maybe? | 18:49 | |
Alias_ | audreyt: ping? | 18:50 | |
18:51
nnunley joined
18:54
ilogger2 joined
|
|||
robkinyon | I'm not sure where to ask this, but what is "self-tying" and why is it so horrible? | 19:10 | |
I ran into the "self-tying of arrays and hashes is not allowed" error and the only thing i can find on it through google is that it was removed in 5.8.9 | 19:11 | ||
errr ... 5.8.0 | |||
(I'd ask in #perl, but I've asked questions there before) | |||
putter | robkinyon: re what is, just from the name I imagine it's something like {package A;sub new {bless $_[1],$_[0]}} my @a; tie @a, A, \@a; so @a is both the variable tied, and the object it is tied too. aside from being hard to use (A methods would have to untie/retie if they wished to use its contents), perhaps it required | 19:55 | |
19:55
qwacky joined
|
|||
putter | some internals gymnastics. ie, @a, the object itself (not merely its contents), would have a ref to itself (the tie ref), so the gc would have to understand this possiblity, and untie it if it had only one ref... so perhaps pain and limited utility. | 19:56 | |
stevan | audreyt: ping | 20:06 | |
hey putter :) | |||
robkinyon | putter: Thanks | 20:09 | |
i don't think it would be that hard to use | 20:10 | ||
but, i was storing object data in a separate %object_data hash keyed by the stringification of the retval of tie( | 20:11 | ||
audreyt | stevan: yes? | ||
stevan: I'm 1.5 chapters into TAOMP | 20:12 | ||
stevan | audreyt: I havent heard back from tpf yet, do you know something I dont ? :) | ||
audreyt | stevan: I happen to, yeah :) | ||
stevan | ah,.. oh well | ||
how do you like AMOP? | 20:13 | ||
audreyt | so I'll come visit you instead | ||
stevan | audreyt: that works :) | ||
audreyt | AMOP is nice | ||
stevan | however, the sushi is not as good here :) | ||
audreyt | though very elementary so far | ||
because you've brainwashed me already | |||
stevan | audreyt: :) | ||
the more interesting bits come when they break down the ways to extend the MOP | 20:14 | ||
I am working on that kind of stuff with Class::MOP right now actually | |||
I have been thinking that we need to seperate the MOP for p6 from the new/bless/CREATE/BUILDALL/BUILD part | 20:15 | ||
robkinyon | stevan: Will the MOP allow you to specify how WALK and WALKMETH is going to work? | ||
stevan | robkinyon: I think it should yes | ||
robkinyon | That would be very cool. | 20:16 | |
stevan | in other words,.. I dont want the MOP to be tied to S12 at all | ||
audreyt | <aol/> | ||
I think that's the way to go, yeah | |||
robkinyon | does that mean you want to describe S12 in terms of the MOP or are S12 and the MOP in parallel? | 20:17 | |
stevan | S12 should be implemented in terms of the MOP | ||
20:17
KingDiamond joined
|
|||
stevan | I am gonna try doing it with Class::MOP first | 20:17 | |
robkinyon | So, if that's the case, then can I ditch S12 and implement Rob::S12 instead? | ||
stevan | see what happens there | 20:18 | |
robkinyon | s/can I/should I be able to/ | ||
stevan | robkinyon: yes you can :) | ||
robkinyon | LOL | ||
stevan | S12 ties the MOP down in too many places and makes things like repr types and containers a real pain | ||
they should not be a pain, they should be simple, but they should not be tied to the rest of the object system | 20:19 | ||
20:20
buu joined
|
|||
robkinyon | So, you're saying that S12 should make a set of duck-typed requirements upon the thing that I can build with the MOP | 20:20 | |
then, if I want, I can build Rob::S12 and someone else can build Ruby::S12 and everyone's happy? | |||
stevan | no, I am saying that there should be a MOP deep down which gives you the most generic (class|prototype) based object system we can muster, and what you hack on top of that is your business :) | 20:21 | |
S12 will be the default | 20:22 | ||
to a certain degree the MOP becomes an implementation detail | |||
robkinyon | but, there are going to be P6 subsystems that are going to depend upon a certain implementation of containers | ||
stevan | which allows parts/all of it to be optimized out if you want | ||
robkinyon: nope, same deal | |||
implementation detail | 20:23 | ||
robkinyon | uhh ... i don't think so | ||
stevan | everything should depend on the public APIs | ||
or its an implementation detail IMO | |||
robkinyon | which are built atop of S12 | 20:24 | |
or some S12-implementing item | |||
robkinyon & # dishes ... groceries .... you'd think I was married! | |||
stevan | S12 is a public API | ||
things must conform to it | |||
20:27
orafu joined
20:29
sapper joined
20:33
p5evalbot joined
|
|||
svnbot6 | r9054 | audreyt++ | * pugs -CParse-HsYaml backend for yaml-node based serialization. | 20:48 | |
r9054 | audreyt++ | * slightly improved DrIFT.YAML syntax. | |||
Alias_ | What's DrIFT do btw? | 20:51 | |
A YAML implementation in Haskell/P6/PIL? | 20:52 | ||
gaal | no, it's a haskell-intelligent preprocessor. it lets you do metaprogramming in haskell. | ||
Alias_ | That sounds scary... | 20:53 | |
gaal | we use it to add YAML serialization instances to our data structures | ||
Alias_ | So now Haskell is even more obfuscated :) | ||
gaal | ("instances" in haskell means something like "role consumer") | ||
Alias_ | again in english? | 20:54 | |
gaal | nah, consider this example. | ||
you have a run of the mill data structure that you defined | |||
data Color = Infrared | Red | Orange | Yellow | Violet | 20:55 | ||
in haskell, you can add a trait to this type, saying that these possible variants are equatable | |||
so that haskell automatically knows to tell that Orange == Orange but Red /= Orange | 20:56 | ||
this is spelled simply "derives Eq" | |||
Alias_ | is /= is !=? | ||
gaal | the nice thing is that unless you're doing funky stuff, you don't have to suply the code for this yourlsef | ||
Alias_ | erm, is /= haskell for != ? | ||
gaal | yes | ||
integral | =^H/ | 20:57 | |
Alias_ | ok | ||
And so this will let you bulk-import stuff from yaml files? | |||
gaal | you can similarly say that these different possible values have an inherent ordering | ||
Alias_ | right | ||
gaal | so you want to ask whether Red < Infrared and get False | 20:58 | |
you can do this with "deriving Ord" | |||
(s/derives/deriving/ above) | |||
that's a standard "typeclass" | |||
Alias_ | deriving being in essense "dwim as long as it's right" | ||
gaal | in Perl 6 Roles fulfil the same, er, role, more or less | 20:59 | |
Alias_ | to the parser... | ||
right | |||
gaal | you can say that your data type does (say) Eq, but doesn't inherir the defualt implementation at all | ||
there are a number of useful standard classes | 21:00 | ||
Alias_ | right | ||
gaal | two very cool ones being "Show" and "Read" | ||
which stringify stuff and back | |||
Alias_ | And so when do we turn to what drift does :) | ||
gaal | ?eval {a=>"moose"}.perl | ||
ok ok :) | |||
21:01
evalbot_9024 is now known as evalbot_9054
|
|||
evalbot_9054 | "\{(\"a\" => \"moose\"),}" | 21:01 | |
gaal | now say you invent a new typeclass of your own | ||
oh, I don't know, YAML :)_ | |||
you don't want to go to your 17000 user-defined types and write code ("methods") for them, right? | |||
the computer can do that for you | 21:02 | ||
Alias_ | do you normally do that though | ||
gaal | but it's not so simple to let something like the c preprocessor do it, because sometimes you need to be very careful | ||
Alias_ | Do most Haskell programmers have big chunks of code for types? | ||
gaal | how do you mean? | ||
Alias_ | Are types done currently with code | 21:03 | |
Is this filling a need in that way | |||
gaal | oh, well, by type we mean a type of a data structure | 21:05 | |
Alias_ | asin Color | ||
as in | |||
gaal | so a node in the AST can be say a function application | ||
Alias_ | erk... | ||
gaal | App Exp (Maybe Exp) [Exp] | 21:06 | |
Alias_ | OK! My LambdaCamel shipped without a Camel! | ||
gaal | don't worry, that simply means... | ||
Alias_ | This Camel needs a Camel :) | ||
gaal | say "hi!" | ||
Alias_ | don't worry | 21:07 | |
I just spent 4 hours debugging CPAN.pm on the new Win32 Perl, my WPU is nearly spent | |||
gaal | ==> _Apply_ the code _&say_ to (no invocant, this is a function) with the arglist ["hi!"] | ||
if you enter the interactive pugs shell and do :d say "hi!", you'll get it pretty-printed in one format | 21:08 | ||
because App is an instance of Show | 21:09 | ||
Alias_ | ok | ||
gaal | (well actually, App is just one variant of an AST node, like Orange is just one variant of Color) | ||
so any Color knows how to Show itself | |||
as does any Exp | 21:10 | ||
Alias_ runs | |||
21:10
Odin-FOO joined
|
|||
gaal | if you want to have a Color show itself in YAML, you have to write an "asYAML" method on the type Color | 21:10 | |
21:11
Odin-FOO is now known as Odin-LAP
|
|||
gaal | that would emit the part of the YAML representation that is needed | 21:11 | |
avar | does p6 yaml support anon functions? | ||
gaal | in the case of a color, it's trivial, just a string | ||
avar: sure | 21:12 | ||
Alias_ | gaal: wouldn't that open the door for major security issues? | ||
avar | $ perl -MYAML -e 'print Dump $s = { subptr => sub { "foo" }}' | ||
--- | |||
subptr: !perl/code: '{ "DUMMY" } | |||
p5 doesn't... | |||
gaal: is that compatable across languages? | |||
i.e. can I run my perl 6 anon subs on ruby | |||
Alias_ | avar: YAML isn't compatible across languages | ||
gaal | in the case of sometihng more complex, like the syntax for function application, you have to stanradrize on a representation you can make sense of when you want to deserialize | 21:13 | |
avar | it kind-of-is | ||
Alias_ | avar: You need to have a matching serialize/deserializers for each thing in each language | ||
avar: Otherwise... erm... something | |||
gaal | avar: grab a recent pugs and do "./pugs -CParse-YAML -e '{ say "I am a closure" }.()' | 21:14 | |
how's this a security issue? | |||
Alias_ | gaal: The whole point of most exploits is to trick you into running code | ||
gaal: When your data structure embeds arbitrary code, that gets a whole lot easier | |||
That whole data/code seperation issue | 21:15 | ||
integral | but it's not encoding code, it's encoding data... | ||
gaal | now it turns out that for the majority of data types, there's a standard way of doing things that works | ||
but sometimes it breaks down, notably in circular references | |||
integral | it's not code code, but code as an AST, reified, so it's not actual code when it's in the YAML | ||
Alias_ | integral: um... { system 'rm -rf ~' }.() | ||
it still does things | 21:16 | ||
integral | Alias_: no, it's not like that at all. It's like giving you the string "rm -rf", rather than an executable shell script of the same | ||
gaal | Alias_: it's no different from the risk of eval | ||
Alias_ | gaal: Which is why Data::Dumper is completely unsafe as a data serialization language | ||
And why we use things like XML | |||
integral | Alias_: umm, my point is that when this YAML is unserialised this stuff isn't run... | ||
Alias_ | integral: are you sure? | 21:17 | |
gaal | NAK. we are serializing code, not business data | ||
Alias_ | What if it's a init code to a class hook that runs it | ||
gaal | the whole intention is to run this code | ||
integral | yes, it's the difference in Data::Dumper output between: $VAR1 = { case1 => "sub foo { unlink('.') }", case2 => unlink(".") }; | ||
gaal | if the serialized stream is tampered with, sure an attack can be injected | ||
integral | Alias_: we've got the first, because this code *is* data. Because we're INSIDE a compiler. | ||
gaal | that's like me editing your files on your fisk. | ||
*disk. | 21:18 | ||
Alias_ | integral: Right, and the exploit would be finding some deserialisation class that runs it (though you don't realise it might) | ||
or finding some other way to trick you into running it | |||
integral | Alias_: A deserialisation class that just eval'ed any string? | ||
Alias_ | integral: See, you hadn't even considered it | ||
integral | I think someone's either being silly, or misunderstanding how to exploid serialised things. | 21:19 | |
gaal | Alias_: we're talking about things that are all replacements for "eval" in use anyway | ||
integral | *exploit | ||
Alias_ | someone goes and uses this shiny new anon code feature, and it only takes one person to use it in some bit somewhere and forget it's completely untrusted | ||
integral | umm, no. | 21:20 | |
Alias_ | And if you have that things installed, all of a sudden I've got arbitrary execution | ||
gaal | whoa whoa :) what shiny new non code feature? :) | ||
integral | Alias_: Let's imagine two readline functions. | ||
Alias_ | or perhaps closer, a Storable class | ||
integral | One reads a line from the keyboard and returns it. The other does that, but if the first char is ! interprets it as code, and returns the result of that code. | ||
Data::Dumper has the second feature, YAML does NOT. | |||
Alias_ | sure it does | ||
Because it has equivalents of Storable hooks | 21:21 | ||
integral | no, it doesn't have something which says "instead of serialised data, here's some code instead that will give you the data" | ||
Alias_: but they're not in the data stream itself. | |||
Alias_ | right | ||
integral | Someone would have to put a hook in the app that did an eval. But *all* serialisation schemes can have someone put an eval into the app! | 21:22 | |
Alias_ | not the app | ||
gaal | Alias_: the purpose of YAML in the internals work we've been doing is not user tools (although those could be useful) | ||
Alias_ | Any class | ||
Any class that acts as a YAML hook | |||
Because it will autoload the class | |||
or at least, if ingy did something similar to Storable it well | |||
will | |||
(because I don't know any other way to do it) | |||
integral | ugh, autoloading classes?! | ||
Alias_ | How else do you deserialize things | 21:23 | |
gaal | which things? | ||
Alias_ | oh, for example, a singleton | ||
or a database handle | |||
integral | bleh, I like haskell too much where "data" is this nice fixed well defined thing, and it's just typeclasses that vary | ||
gaal | and for which purpose? | ||
Alias_ | gaal: To serialize a larger object that contains one | ||
gaal | Alias_: for the compiler, of for the application? | 21:24 | |
integral | anyway, this particular "feature" of the perl YAML has nothing to do with the haskell YAML luckily. | ||
Alias_ | integral: It's not a feature of Perl so much as a feature of any sufficiently advanced serialization mechanism | ||
It requires some sort of code-assisted serialize/deserialize | |||
integral | Alias_: and an open world model. | 21:25 | |
Alias_ | And so what happens if you don't have every single class already loaded you encounter in the data stream? | ||
it dies? | |||
I hope so | |||
gaal | are you talking haskell type or perl class? | ||
Alias_ | language-neutral | ||
integral | alias must be talking about perl | 21:26 | |
Alias_ | deserialization handler | ||
gaal | don't confuse the internals of the compiler with user-visible technologies perl provides | ||
Alias_ | YAML has class-tagged nodes | 21:27 | |
gaal | sure | ||
Alias_ | they have handlers | ||
? | |||
integral | sure, but in a closed-world application all the handlers are part of the app. | ||
Alias_ | ok | 21:28 | |
So you start a YAML stream | |||
integral | and the current YAML for haskell has no idea of how to start using hs-plugins | ||
Alias_ | And you're going along, and YAML says node "Foo" | ||
And you don't have a class Foo loaded | |||
then what? exception? | |||
gaal | who's "you"? a perl program or the perl compiler? | ||
integral | yes. | ||
The thing haskell is loading has a concrete type, not just an interface that it complies to. | 21:29 | ||
Alias_ | ok then | ||
So no way to load that class | |||
that's all fine | |||
21:29
dduncan joined
|
|||
integral | We know it's *exactly* a tree made from these types of components, not the other view where we know it's a "tree" that has all these methods | 21:29 | |
Alias_ | it introduces other problem, but those are functionality thigns | ||
uh... a yaml tree? | 21:30 | ||
oh, haskell | |||
I wasn't talking about any particular language | |||
It's not a language issue, it's a serialize/deserialize algorithm problem | |||
integral | *sigh* | ||
gaal | Alias_: I still think you're confused. The current YAML work is, in the bottom line, just one technique for the compiler to store program data. | 21:31 | |
Alias_ | And you gave me the answer I wanted, in Haskell's case it can't handle encountering a class-tagged node that isn't already loaded | ||
gaal | it's program data anyway. if someone could manipulate it they could make the perl it represents do evil things | ||
integral | Alias_: that's not a very good way to be viewing what you've got. | ||
gaal | but I don't see your threat model. | ||
integral | In haskell you've got data, plain old data, it doesn't have methods. What you normally seralise in perl are objects and an object is both data *and* the behaviour. | 21:32 | |
Alias_ | integral: That is not the issue | ||
integral | Yes, it is. | ||
Alias_ | no, it isn't | ||
integral | Yes, it is. | ||
Alias_ | The threat model NEVER has to call an object method | 21:33 | |
So the object's behaviour is NOT a problem | |||
integral | But if you're not loading an object, there is no "class tagged node that isn't already loaded" | ||
Alias_ | right | ||
well, not entirely, but close enough | |||
integral | That's my point, your final statement was close enough but not entirely. | 21:34 | |
Alias_ | but lets say yes for the sake of argument | ||
gaal | Alias_... we're currently loading nodes in a parse tree. If someone controls these nodes, the program that'll get run will be pwned anyway | ||
Alias_ | That's not true... | 21:35 | |
Otherwise XML would be impossible | |||
And you could exploit everything | |||
gaal | well anymoose. I have to sleep now | ||
good night :) | |||
21:36
calanya joined
|
|||
integral | Alias_: well you can. XML that is XHTML containing a <script> tag that is run with full permissions of the browser user. | 21:36 | |
Alias_ | exactly | ||
because someone OTHER than you implemented it | |||
gaal | zZ& | ||
integral | So, yes, in this case, the one gaal talks about, it is true. | ||
Alias_ | But in that case, you know it's XHTML | 21:37 | |
actually, it applies | |||
ideally you'd be using data types with no support for that | |||
So you can not have to worry | |||
And no support for injecting arbitrary types into the node stream | 21:38 | ||
because the format is closed | |||
YAML supports arbitrarily tagged nodes | |||
Much like I guess you could say any XML document could set a namespace to be XHTML | 21:39 | ||
integral gives up & | |||
Alias_ | If the XHTML handler loads on demand, then just by virtue of having an XHTML handler installed, any XML document can execute arbitrary code | ||
21:39
DesreveR joined
|
|||
Alias_ | without ever calling a "method" on the <script> object | 21:40 | |
See, I said I needed a camel | 21:42 | ||
... with my lamda | |||
Alias_ wander off | |||
audreyt | Alias_: YAML has arbitrarily tagged nodes, yes. we ignore everything but the tags we know how to handle. | 21:45 | |
Alias_ | See! | ||
One camel and my issue is resolved in a single line | |||
audreyt | it's a fatal error, actually. | ||
Alias_ | :) | ||
good | |||
Then it's not a security problem | |||
audreyt | I'd be very sure it's not, yeah :) | 21:46 | |
Alias_ | Well, unless you preload any handler you don't understand that executes the code block | ||
either way, I still think it turns something patently stupid "executing an arbitrary string of code" into something more tempting "executing nice trustworthy code trees" | |||
audreyt | yes. | 21:47 | |
though we were doing that patently stupid thing at the first place | |||
in loading Prelude.pm and run it | |||
Alias_ | and that approachability is often half the problem | ||
audreyt | and we are just replacing that into the more tempting (and easier to check) code trees. | ||
Alias_ | well, it's the handler that's the problem really, not the actual code | ||
audreyt | right. and in this case, we write no handler ourselves | 21:48 | |
Alias_ | that only matter once the handler might potentially execute it | ||
audreyt | the handler is derived from the static structure of the types that we are accepting. | ||
there is no human intervention possible in writing handlers. | |||
Alias_ | in your case :) | ||
audreyt | yeah. :) | ||
Alias_ | For an exploit to happen, generally 5 things go wrong | ||
audreyt | (I agree with your general analysis.) | ||
Alias_ | 1 being "YAML supports code" | ||
audreyt | (just that we are not tripping it) | 21:49 | |
Alias_ | right | ||
BTW, I'm very close to throwing Module::Install::Compiler away :) | |||
audreyt | excellent | ||
Alias_ | I had a read of what the makefile params actually do | ||
And I'm amazed you can make anything work with what's in ::Compiler :) | |||
well, not true | 21:50 | ||
I'm amazed you can make something like YAML::Syck work | |||
audreyt | excellent :) | ||
Alias_ | Which would seem at first glance to exceed the notional complexity threshhold | ||
I'll probably need some help here and there to work out which commands can be implemented that are useful to real life XS coding | 21:51 | ||
I have some ideas | |||
but I'm dealing with some support code first | |||
I also don't have the time for a job this big :) | 21:52 | ||
But so you know, don't release 0.57 without talking to me first | |||
audreyt | I'll leave it for you to release anyway. | ||
Alias_ | Because there's some transitional things there and it's not really quite in release state | ||
I'd also like some help at some point on testing | 21:53 | ||
Create me a sample test case for example... | |||
not sure exactly how to make one without risking actually installing things or interacting with the parent install | |||
:) | |||
audreyt | *nod* | 21:55 | |
Alias_ | And I'm trying to resist rewriting the whole thing | ||
But that's par for the course | |||
:) | 21:56 | ||
And it's fractally complex, so too many risks | |||
21:59
ayrnieu joined
|
|||
svnbot6 | r9055 | gaal++ | * DrIFT.YAML - add a default, erroring instance for fromYAMLElem, | 22:43 | |
r9055 | gaal++ | thus eliminating trillions of pesky warnings. | |||
gaal | you can tell you're under an Audrey field when you commit after you'd gone to sleep | 22:45 | |
beppu | Alias_, this is the Module::Install ticket you asked me to write last night: rt.cpan.org/Public/Bug/Display.html?id=17731 | ||
It's about being able to customize what happens during installation. | |||
Alias_ | ok | 22:46 | |
23:32
scook0 joined
23:35
drbean joined
23:51
lumi joined
|
|||
Alias_ | beppu: I've replied to your bug btw, on the subject for share, which does exist | 23:51 | |
23:51
gaal joined
|
|||
beppu | I'll take a look | 23:52 | |
Alias_ | beppu, and we've got limited etc capability | ||
See... | |||
File::UserConfig | |||
That's a user-specific etc, but it fits into the resource model properly | 23:53 | ||
beppu | I didn't know about these. | ||
Alias_ | I only wrote them at Christmas :) | ||
The share stuff has existed for ages, but is arcane and few people know about | 23:54 | ||
I wrapped some user-friendly shell around it when audreyt told me it existed | |||
The File::UserConfig is just a combination of that, plus the new File::HomeDir implementation | |||
more an elegant trick than a full on resource though | 23:55 | ||
but correct | |||
beppu | I'll consider using these. | ||
Alias_ | doing system etc has issues | ||
beppu | It's hard to be portable, right? | ||
Alias_ | So I have no answers for that, yet | ||
very | |||
Perl runs on 100+ platforms | |||
which is under the skin, share is a variation on lib | 23:56 | ||
which is why ... | |||
And homedir is only tested on Win32, basic Unix and OS X | |||
So there might be variations | |||
beppu | that covers a lot, though. | ||
Alias_ | enough for desktop applications :) | 23:57 | |
Which is what I'm using it for | |||
beppu | It's mostly Win32 that would be problematic, I would think. | ||
Alias_ | it's all three | ||
for homedir at least | |||
Mac OS X is not entirely like Unix | |||
beppu | what about the share stuff. How does that work using File::ShareDir? | 23:58 | |
nvmd. i rtfm'd. | 23:59 | ||
Alias_ | Module::Install::Share provides the stuff to install it to the right place, which is the same technique used by autosplit and other core modules | ||
File::ShareDir adds the logic to locate it afterwards |