コンテキストによって返す値を変える関数 - use Want 編が微妙な件
HASHかどうかの判別がなんかへんなのに気がついた。
mainでの判別は問題ないんだけど、ほかのpackageのメッソッド内の map の中だと HASH かどうかの判別ができない。下のコードでは自packageだけど、ほかのクラスの中でkureを読んだ場合も同じように map の中だと HASH かどうかの判別ができない。
なんでだろうーなんでだろうー
WantはPL_op*を覗いてるようでちょっと黒魔法的ですね!
#!/usr/bin/env perl use strict; use warnings; use Perl6::Say; use IO::File; STDOUT->autoflush(1); STDERR->autoflush(1); MAIN: { my $oc = OrenoClass->new(nanka => { sushi => 'hattori' }); say "* main"; my $s = $oc->kure; # => SCALAR RVALUE my %h = %{ $oc->kure }; # => SCALAR REF HASH RVALUE map { my $s = $_->kure; # => SCALAR RVALUE my %h = %{ $_->kure }; # => SCALAR REF HASH RVALUE } ($oc); say "* mainnokurekure"; mainnokure($oc); $oc->kurekure; exit; } sub mainnokure { my $s = $_[0]->kure; # => SCALAR RVALUE my %h = %{ $_[0]->kure }; # => SCALAR REF HASH RVALUE map { my $s = $_->kure; # => SCALAR RVALUE my %h = %{ $_->kure }; # => SCALAR REF HASH RVALUE } @_; } package OrenoClass; use Perl6::Say; use Want; sub new { my($class, %args) = @_; return bless {%args}, $class; } sub kurekure { my($self) = @_; say "* kurekure"; { my $s = $self->kure; # => SCALAR RVALUE my %h = %{ $self->kure }; # => SCALAR REF HASH RVALUE } map { my $s = $_->kure; # => SCALAR RVALUE my %h = %{ $_->kure }; # => SCALAR RVALUE !!! } ($self); } sub kure { my($self) = @_; my @ctx; for my $c (qw( VOID SCALAR REF REFSCALAR CODE HASH ARRAY GLOB OBJECT BOOL LIST LVALUE RVALUE )) { if (want($c)) { push @ctx, $c; } } warn join(" ", @ctx)."\n"; if (want('HASH')) { return +{ %{$self->{nanka}} }; } else { return $self->{nanka} } }