Welcome to the Monastery PerlMonks

by ariels (Curate)
 on Jan 06, 2002 at 12:56 UTC ( #136663=note: print w/replies, xml ) Need Help??

Here's one example. The Hamming sequence is the sequence of numbers whose prime factors are only 2, 3 and 5, in ascending order. Writing a program to print out the sequence is non-trivial (we exclude "solutions" which must store the entire sequence in a large array and the like). It used to be the poster example of co-routines, but current style more likely favours a functional program using streams and (somewhat) lazy evaluation.

Read about streams in this chapter of Structure and Interpretation of Computer Programs. The program below is a translation to Perl of a streams-based program to print out the Hamming sequence.

```#!/usr/local/bin/perl -w
# Output the Hamming sequence
use strict;

package Stream;

sub new {
my (\$class, \$hd, \$tl) = @_;
\$class = ref \$class || \$class;
bless { _hd => \$hd, _tl => \$tl }, \$class
}

my \$self=shift;
\$self->{_hd}
}

sub tail {
my \$self = shift;
\$self->{_tl} = \$self->{_tl}->()
if ref \$self->{_tl} eq 'CODE';
\$self->{_tl}
}

sub exec {
my (\$self, \$code, \$n) = @_;
for my \$i (1..\$n) {
\$self = \$self->tail
}
}

package main;

sub merge {
my (\$a, \$b) = @_;
new Stream(\$a->head, sub { merge(\$a->tail, \$b->tail) }) :
new Stream(\$a->head, sub { merge(\$a->tail, \$b) }) :
new Stream(\$b->head, sub { merge(\$a, \$b->tail) });
}

sub mult {
my (\$a, \$s) = @_;
return new Stream(\$a*\$s->head, sub { mult(\$a,\$s->tail) });
}

my \$hamming;
\$hamming = new Stream(1,
sub {
merge( mult(2, \$hamming),
merge(mult(3, \$hamming),
mult(5, \$hamming)))
}
);

my @x;
\$hamming->exec(sub { push @x, shift }, 1000);

print "@x\n";

EDIT (20020506): fix indentation (Perlmonks does horrible things to tabs; glad it's not Pythonmonks).

Create A New User
Node Status?
node history
Node Type: note [id://136663]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
As of 2018-03-18 04:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
When I think of a mole I think of:

Results (228 votes). Check out past polls.

Notices?