develooper Front page | perl.perl6.users | Postings from December 2017

Re: How to accomplish a method interpolation?

Thread Previous | Thread Next
From:
Brandon Allbery
Date:
December 30, 2017 12:23
Subject:
Re: How to accomplish a method interpolation?
Message ID:
CAKFCL4X1cijtWohDYukJqcOvhf01ZbkmA2L15KBTnk-Xa4bVqQ@mail.gmail.com
Uh, it's a D&D thing. It's not just a programmatic container representing
inventory, but has its own gameplay qualities (in original D&D, for
example, it reduced inventory weight by a lot). I'd guess that currently
it's not doing anything special, but might well be intended to do so later
--- either "magical" like the original bag of holding, or just providing
methods for in-game inventory management functions, or etc. Some of that
might be doable by subclassing a mutable container, but others might well
require something smarter: for example, some items "stack" (one arrow is
like any other arrow, at least if they have the same enchantment) and
others must be duplicated (every wand has its own independent charge state
and must not be combined even if they have the same charge currently), and
rather than making the code using it figure out how the container
associated with each key works, you build that into the object.

On Sat, Dec 30, 2017 at 7:07 AM, Elizabeth Mattijsen <liz@dijkmat.nl> wrote:

> But that's the kind of semantic that Bag/BagHashes are meant to perform: a
> "bag of holding”! Or am I missing something?
>
>
> > On 30 Dec 2017, at 12:55, Brandon Allbery <allbery.b@gmail.com> wrote:
> >
> > I think this is just name collision; this sounds like a dungeon crawler
> type thing and it's a "bag of holding".
> >
> > On Sat, Dec 30, 2017 at 6:45 AM, Elizabeth Mattijsen <liz@dijkmat.nl>
> wrote:
> > > On 30 Dec 2017, at 06:13, clasclin . <clasclin@gmail.com> wrote:
> > >
> > > I'm reading a book "Make your own python text adventure" and decided
> to give it a try with perl6. So this code works as expected.
> > >
> > > class Bag {
> > >     has %.items;
> > >
> > >     method show {
> > >         say "ropa ", %!items<ropa>.amount
> > >             if %!items<ropa>:exists;
> > >         say "femur ", %!items<femur>.amount
> > >             if %!items<femur>:exists;
> > >         say "fósforos ", %!items<fósforos>.amount
> > >             if %!items<fósforos>:exists;
> > >     }
> > > }
> > >
> > > I'm using a class called bag as my inventory and trying to keep track
> of items in a hash, so the key is just a name and the value is an object
> and just found that a pattern when I try to list the elements on the
> screen...
> > >
> > > dd %!items
> > > Hash %!items = {:femur(Items::Femur.new(amount => 1)),
> :fósforos(Items::Matches.new(amount => 3)), :ropa(Items::Cloth.new(amount
> => 4))}
> > >
> > > Items has data and the show method does what I expect, then I change
> the code, so I try to add a private method that handdle the pattern and
> change the show method to use the private one.
> > >
> > > class Bag {
> > >     has %.items;
> > >
> > >     method !show-item ($msg, $item, $attr) {
> > >         # dd $msg; dd $item; dd $attr; # all Str
> > >         say "$msg ", %items{$item}.$attr
> > >             if %!items{$item}:exists;
> > >     }
> > >
> > >     method show {
> > >          self!show-item('Ropa', 'ropa', 'amount');
> > >          ...
> > >      }
> > > }
> > >
> > > Now I get an error, the line corresponds to the private method
> > > No such method 'CALL-ME' for invocant of type 'Str'
> > >
> > > Try a few variants like return instead of say or things like
> > >     say "$msg", "%!items{$item}.$attr"; # output: Ropa
> Items::Cloth<94810994868552>.amount
> > >     say "$msg", $!items{$item}.{$attr}; # output: Type Items::Cloth
> does not support associative indexing.
> > >     say "$msg", %!items{$item}."{$attr}"; # ouput: gives a compile
> error
> > >
> > > The output I'm expecting is: Ropa 4
> > > Ropa is the $msg, and 4 corresponds to the value in the attribute
> amount.
> > >
> > > Is there a way to refactor my code? Thanks in advance.
> >
> > Are you aware that Perl 6 has an immutable Bag class (
> https://docs.perl6.org/type/Bag )
> >  and mutable BagHash class ( https://docs.perl6.org/type/BagHash )
> built in ???
> >
> >
> >
> > --
> > brandon s allbery kf8nh                               sine nomine
> associates
> > allbery.b@gmail.com
> ballbery@sinenomine.net
> > unix, openafs, kerberos, infrastructure, xmonad
> http://sinenomine.net
>



-- 
brandon s allbery kf8nh                               sine nomine associates
allbery.b@gmail.com                                  ballbery@sinenomine.net
unix, openafs, kerberos, infrastructure, xmonad        http://sinenomine.net

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About