Hi,
First of all congratulations to all involved in the amazing Inline
package.
You do deserve all the awards and beer that you're getting.
As a way to explore deeper the Inline details, and as Perl is a language
that was made to make your job easier, Inline allows us to include
in Perl languages developed to make our job *HARD*.
As ASM was already available, i went for more obscure ones,
and brainfuck was the chosen one.
If you don't know Urban Mueller's Brainfuck already, it's an
8 command set language, check http://www.catseye.mb.ca/esoteric/bf/
Basically it's just a regexp set that converts the brainfuck
instructions
to Perl code, this had already been done by Markko Nippula,
http://www.hut.fi/~mnippula/useless/
.
Here's the JaXH subroutine:
use Inline Brainfuck => <<EOF;
JaXH (
>+++++++++[<++++++++>-]<++.>+++++++[<++++++>-]<+.--.+.[-]>++++++++[<++++>-]<.>+
+++++++[<++++>-]<+.>+++++++[<++++++>-]<+++.+.+++++.>++++[<--->-]<.---.>++++[<++
+>-]<+.[-]>++++++++[<++++>-]<.,[.,][-]>++++++++[<++++>-]<.>+++++[<++++++++>-]<.
>+++++[<+++++>-]<.++.++++++++.------.>++++[<+++>-]<+.[-]++++++++++.
)
EOF
print JaXH("Inline");
The Brainfuck input command (",") reads from $_[0],
The Brainfuck print command (".") is buffered and returned.
Anyway, just another way to congratulate you guys for the wonderful work
and documentation that allowed me to get into Inline world in a morning.
Have fun!
Jo�o Pedro Gon�alves
package Inline::Brainfuck;
$VERSION = '0.01';
require Inline;
@ISA = qw(Inline);
use strict;
use Carp;
sub register {
return {
language => 'Brainfuck',
aliases => ['brainfuck'],
type => 'interpreted',
suffix => 'bf',
};
}
sub usage_config {
my $key = shift;
"'$key' is not a valid config option for Inline::Brainfuck\n";
}
sub validate {
my $o = shift;
$o->{ILSM}{PATTERN} ||= 'bf-';
$o->{ILSM}{BAR} ||= 0;
while (@_) {
my ($key, $value) = splice @_, 0, 2;
if ($key eq 'PATTERN') {
$o->{ILSM}{PATTERN} = $value;
next;
}
croak usage_config($key);
}
}
sub bf_interp {
$_ = shift;
s/\(/__/g;
s/\)/==/g;
s/([\[\]+-<>\.,])/$1;/g;
s/(\+|-)/P$1$1/g;
s/</\$p--/g;
s/>/\$p++/g;
s/\./ \$buf .= chr P/g;
y/[]/{}/;
s/{/while(P){/g;
s/,/P=ord substr(\$_[0],\$i++,1)/g;
s/P/\$m[\$p]/g;
s/==/return \$buf }/g;
s/(\w+) __/sub $1 {my (\$p,\$buf,\$i,\@m);/g;
return $_;
}
sub build {
my $o = shift;
my $code = $o->{API}{code};
my $pattern = $o->{ILSM}{PATTERN};
$code = bf_interp($code);
{
package Brainfuck::Tester;
eval $code;
}
croak "Brainfuck build failed:\n$@" if $@;
my $path = "$o->{API}{install_lib}/auto/$o->{API}{modpname}";
my $obj = $o->{API}{location};
$o->mkpath($path) unless -d $path;
open FOO_OBJ, "> $obj"
or croak "Can't open $obj for output\n$!";
print FOO_OBJ $code;
close \*FOO_OBJ;
}
sub load {
my $o = shift;
my $obj = $o->{API}{location};
open FOO_OBJ, "< $obj"
or croak "Can't open $obj for output\n$!";
my $code = join '', <FOO_OBJ>;
close \*FOO_OBJ;
eval "package $o->{API}{pkg};\n$code";
croak "Unable to load Foo module $obj:\n$@" if $@;
}
sub info {
my $o = shift;
}
1;
__END__