NAME
Language::Befunge - a Befunge-98 interpreter.
SYNOPSIS
use Language::Befunge;
read_file( "program.bf" );
run_code;
Or, one can write directly:
store_code( <<'END_OF_CODE' );
v @,,,,"foo"a <
> ^
END_OF_CODE
run_code;
DESCRIPTION
Enter the realm of topological languages!
This module implements the Funge-98 specifications on a 2D field (also called Befunge). In particular, be aware that this is not a Trefunge implementation (3D).
This Befunge-98 interpreters assumes the stack and Funge-Space cells of this implementation are 32 bits signed integers (I hope your os understand those integers). This means that the torus (or Cartesian Lahey-Space topology to be more precise) looks like the following:
32-bit Befunge-98
=================
^
|-2,147,483,648
|
| x
<-----------+----------->
-2,147,483,648 | 2,147,483,647
|
y|2,147,483,647
v
This implementation is meant to work on unix-like systems, because this interpreters only handle the character which ordinal value is 10 (also known as \n) as an End-Of-Line chars. In particular, no warranty is made neither for Microsoft systems (\r\n) nor for Macs (\r).
PRIVATE FUNCTIONS
debug( )
Output debug messages.
EXPORTED FUNCTIONS
read_file( filename )
Read a file (given as argument) and store its code.
Side effect: clear the previous code.
store_code( code )
Store the given code in the Lahey space.
Side effect: clear the previous code.
run_code( )
Run the current code. That is, create a new Instruction Pointer and move it around the code.
Return the exit code of the program.
TODO
- o
-
Maybe rewrite the core loop in order to take benefits of the hash mechanism instead of a giant switch tester.
- o
-
Check all the module docs.
- o
-
Write standard libraries.
BUGS
Although this module comes with a full set of tests, maybe there are subtle bugs - or maybe even I misinterpreted the Funge-98 specs. Please report them to me.
There are some bugs anyway, but they come from the specs:
- o
-
About the 18th cell pushed by the
yinstruction: Funge specs just tell to push onto the stack the size of the stacks, but nothing is said about how user will retrieve the number of stacks. - o
-
About the 19th cell pushed by the
yinstruction: what this interpreter pushes on the stack may not be accurate, since this is a module and the main perl application may have already processed the command line. - o
-
About the load semantics. Once a library is loaded, the interpreter is to put onto the TOSS the fingerprint of the just-loaded library. But nothing is said if the fingerprint is bigger than the maximum cell width (here, 4 bytes). This means that libraries can't have a name bigger than
0x80000000, ie, more than four letters with the first one smaller thanP(chr(80)).Since perl is not so rigid, one can build libraries with more than four letters, but perl will issue a warning about non-portability of numbers greater than
0xffffffff.
AUTHOR
Jerome Quelin, <jquelin@cpan.org>
COPYRIGHT
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.