in reply to Re^2: Perl can do it, take 1 (sentence generation)
in thread Perl can do it, take 1 (sentence generation)
Like I said, probably a step too far, but I was trying to stay true to the Lisp original. If the intent is to completely Perlify the algorithm, then you probably wouldn't use the listp() abstraction (and it certainly wouldn't be called that:).
If Perl's if then elsif else construct worked like those in Haskell or SQL, you could do
return if <cond> then <value> elsif <cond2> then <val2> else <val3>;
The nearest I could get is the nested ternaries.
I also tried to code the cond macro, and got pretty close. It follows all the right paths, but implementing rewrite is much harder, and the values don't filter up without that.
#! perl -slw use strict; my %dict = ( sentence => [ [ qw/ noun_phrase verb_phrase / ] ], noun_phrase => [ [ qw/ Article Noun / ] ], verb_phrase => [ [ qw/ Verb noun_phrase / ] ], Article => [ qw/ the a /], Noun => [ qw/ man ball woman table/ ], Verb => [ qw/ hit took saw liked / ] ); sub rand_elt { return @{ $_[ 0 ] }[ rand @{ $_[ 0 ] } ]; } sub listp { return ref $_[0] eq "ARRAY"; } sub cond; sub cond { return shift->() || cond @_; } sub generate; sub generate { my $phrase = shift; warn $phrase.$/; return cond sub{ warn 'A'.$/; return listp( $phrase ) ? map{ generate $_ } @{ $phrase } : () }, sub{ warn 'B'.$/; return exists $dict{ $phrase } ? generate rand_elt $dict{ $phrase } : () }, sub{ warn 'C'.$/; return 1 ? $phrase : () }; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Perl can do it, take 1 (sentence generation)
by fergal (Chaplain) on Jun 21, 2005 at 12:54 UTC | |
by BrowserUk (Patriarch) on Jun 21, 2005 at 14:37 UTC | |
by fergal (Chaplain) on Jun 21, 2005 at 17:07 UTC | |
by BrowserUk (Patriarch) on Jun 21, 2005 at 17:21 UTC | |
by fergal (Chaplain) on Jun 21, 2005 at 17:59 UTC |