Re: slurp, quine and context sensitivity
Dan Kogai wrote: ~slurp $file; Very clever. But still not good enough when it comes to autoboxing. { ~slurp }($*PROGRAM_NAME).print and even (~slurp $*PROGRAM_NAME).print works as expected but since "~slurp $file" is really ~(slurp $file), $*PROGRAM_NAME.~slurp.print does not. You want: (~$*PROGRAM_NAME.slurp).print; Or: $*PROGRAM_NAME.slurp(sep=>undef).print; The problem of ~stringify, ?boolify, and +numify is that they are infix operators so it goes the opposite direction. Oh, while I was testing all these on pugs, I came across this. ## say $*PROGRAM_NAME.slurp.elems; ## That call to .slurp is in scalar context, since the result is immediately used as an object. This says 1 but ## my @lines = $*PROGRAM_NAME.slurp; say @lines.elems; ## says 3. That .slurp is in list context. Damian
Re: slurp, quine and context sensitivity
On Apr 08, 2006, at 19:34 , Dan Kogai wrote: does not. The problem of ~stringify, ?boolify, and +numify is that they are infix operators so it goes the opposite direction. s/infix/prefix/ Sorry. Dan the Perl6 Golfer on the Bunker
Re: slurp, quine and context sensitivity
On Apr 08, 2006, at 18:45 , Damian Conway wrote: Dan Kogai wrote: With that understood, I would welcome if we have a version of slurp () which unconditionally returns a scalar. That'd be: ~slurp $file; :-) Very clever. But still not good enough when it comes to autoboxing. { ~slurp }($*PROGRAM_NAME).print and even (~slurp $*PROGRAM_NAME).print works as expected but since "~slurp $file" is really ~(slurp $file), $*PROGRAM_NAME.~slurp.print does not. The problem of ~stringify, ?boolify, and +numify is that they are infix operators so it goes the opposite direction. Oh, while I was testing all these on pugs, I came across this. ## say $*PROGRAM_NAME.slurp.elems; ## This says 1 but ## my @lines = $*PROGRAM_NAME.slurp; say @lines.elems; ## says 3. This I am confused. Dan the Perl6 Golfer on the Bunker
Re: slurp, quine and context sensitivity
Dan Kogai wrote: With that understood, I would welcome if we have a version of slurp() which unconditionally returns a scalar. That'd be: ~slurp $file; :-) Damian
slurp, quine and context sensitivity
Folks, This is a poetic quine (or quine-maker) in perl5. open myself, $0 and print ; The same thing in perl6 would be: my $self = open $*PROGRAM_NAME; for =$self { say } or my $self = open $*PROGRAM_NAME; say for =$self; or my $self = slurp $*PROGRAM_NAME; print $self; or even $*PROGRAM_NAME.slurp.map:{ print }; The last example must not be $*PROGRAM_NAME.slurp.print; You can check it out by running the code below; ## $*PROGRAM_NAME.slurp.print ## Will print: ##$*PROGRAM_NAME.slurp.print## This is because print() (and say()) expects list context and slurp() passes an array of chomped strings. When it comes to autoboxing, the context-sensitivity of builtins may bite you like this. With that understood, I would welcome if we have a version of slurp() which unconditionally returns a scalar. Say swallow()? Of course it is as easy to implement as the following; sub swallow($file){ my $content = slurp $file; return $content }; But like say(), I would love to have something like that as a builtin. Or am I getting too much ruby recently? Dan the Perl6 Addict