in reply to Re: Re: Re: Using Perl6 patterns/grammar definition for <I>output</I>?
in thread Using Perl6 patterns/grammar definition for 'output'?

I see: instead of having formatting as a side-effect of the grammar rules, you would supply separate formatting rules that match by name. If there is a match, it uses that and doesn't look at the corresponding grammar rule.

I think the way you write it should certainly be possible, meaning that the grammar object should be traversible enough to allow format.output to be written in Perl.

I like that how the return value is the text to output, but I don't see how $date, $currency, etc. would become implicit like they are in the grammar. If the populated $0 becomes the current topic when a call is made, that would be easy enough: $.currency, right?

—John

  • Comment on Re: Re: Re: Re: Using Perl6 patterns/grammar definition for <I>output</I>?

Replies are listed 'Best First'.
Re^5: Using Perl6 patterns/grammar definition for <I>output</I>?
by dpuu (Chaplain) on Sep 05, 2002 at 21:28 UTC
    Yes, I definitely want to have an iterator that I can use to traverse a grammar in Perl6. However, a bit more thought gave me this idea:
    class MyFormat is CORE::GrammarVisitor { my $fh is public; method date ($node) { $fh.printf("%04d-%02d-%02d", $node ^. qw(year month day)) } } $0.traverse(MyFormat.new(fh=>$*STDOUT)); # default ctor?
    This is probably the type of code that would have been instantiated by the hash approach; but is more flexible, and allows for more powerful formating concepts (the visitor can maintain state between the things that it outputs).

    But going back to the hash-based approach, I think that it is possible to do something like:

    my $sub = sub {print $value}; $sub.MY{'$value'} = 42; $sub();
    I think this would be kinda scary though.

    --Dave

    Update: Fixed typo: MY{'$date'} becomes MY{'$value'}

      Yes, the GrammarVisitor derived class is symetric with the grammar itself: members match rules, and you can derive from them to alter things. I like it.

      I don't understand your second listing. $sub.MY{'$date'} is going to set a variable inside that closure, I take it? But the sub never uses it.

      —John