I am forwarding the comment below from Jean-Damien into the group for feedback.

My sense of the matter is that Perl methods using named argument hashes are entitled to consume them in the process. That means that after

   $hashp = { ... repeatedly useful things };
   my $recognizer = Marpa::R2::Scanless::R->new($hashp);

reuse of $hashp cannot be relied on to work, because Marpa::R2's methods may consume the hash pointed to by $hashp. (Marpa often needs to process its arguments in stages, and finds its useful to track those already processed by deleting elements.) Note that the user can get around this by copying the hash, which moves the overhead for these unusual argument manipulations from application to user, which to my mind is a good thing.

Anyone else have a sense of this matter? Simply stating your personal preference is OK, but I'll give greater weight to evidence of best practices, traditions, etc.

-- jeffrey

-------- Original Message --------
Subject:        Re: [Marpa--R2] Work on multiple lexers: t+, but noisy (f9d2b50)
Date:   Sat, 21 Dec 2013 08:00:51 -0800
From:   jddurand <notificati...@github.com>
Reply-To: jeffreykegler/Marpa--R2 <reply+c-4923070-46b158946abddd67de008743caef1226be890a0d-173...@reply.github.com>
To:     jeffreykegler/Marpa--R2 <marpa-...@noreply.github.com>



Playing with user's arguments has side-effects. The line:

|delete $args[0]->{grammar};
|

in particular is disastrous for callers that are storing a reference to a precompiled grammar, not having a reference to it anywhere else in this program than in the hash given in input to R->new().

For example, if the grammar is precompiled and referenced only in a hash used as a R->new() parameter, then Scanless will happily destroy the precompiled grammar.

Example with the perl6 advent calendar where I modified the arguments to R->new(). Look to $hashp in the source code at https://gist.github.com/jddurand/8071223

Output is:

|2♥ 5♥ 7♦ 8♣ 9♠                           : OK
'grammar' name argument to scanless_r->new() is undefined
  It should be a ref to Marpa::R2::Scanless::G
Marpa::R2 exception at /tmp/perl6advent.day18.with.marpa.pl line 22.
|

—
Reply to this email directly or view it on GitHub <https://github.com/jeffreykegler/Marpa--R2/commit/f9d2b50d9226c918738e9760c64c2893d6d13cc8#commitcomment-4923070>.



--
You received this message because you are subscribed to the Google Groups "marpa 
parser" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to marpa-parser+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to