Re: slurp, quine and context sensitivity

2006-04-08 Thread Damian Conway

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

2006-04-08 Thread Dan Kogai

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

2006-04-08 Thread Dan Kogai

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

2006-04-08 Thread Damian Conway

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

2006-04-08 Thread Dan Kogai

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