Language::Befunge::Wrapping::LaheySpace - a LaheySpace wrapping


Language-Befunge documentation Contained in the Language-Befunge distribution.

Index


Code Index:

NAME

Top

Language::Befunge::Wrapping::LaheySpace - a LaheySpace wrapping

DESCRIPTION

Top

LBW::LaheySpace implements a wrapping as defined in befunge specs - ie, when hitting a bound of the storage, the ip reverses and backtraces until it bumps into another bound, and then it reverses one last time to keep its velocity.

CONSTRUCTOR

Top

LBW::LaheySpace->new;

Creates a new LaheySpace wrapping.

PUBLIC METHODS

Top

$wrapping->wrap( $storage, $ip )

Wrap $ip in $storage according to this module wrapping algorithm. See DESCRIPTION for an overview of the algorithm used.

Note that $ip is already out of bounds, ie, it has been moved once by LBI.

As a side effect, $ip will have its position changed.

SEE ALSO

Top

Language::Befunge.

AUTHOR

Top

Jerome Quelin, <jquelin@cpan.org>

COPYRIGHT & LICENSE

Top


Language-Befunge documentation Contained in the Language-Befunge distribution.

#
# This file is part of Language::Befunge.
# Copyright (c) 2001-2009 Jerome Quelin, all rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.
#
#

package Language::Befunge::Wrapping::LaheySpace;

use strict;
use warnings;

use base qw{ Language::Befunge::Wrapping };


# -- PUBLIC METHODS

#
# $wrapping->wrap( $storage, $ip );
#
# Wrap $ip in $storage according to this module wrapping algorithm. Note
# that $ip is already out of bounds, ie, it has been moved once by LBI.
# As a side effect, $ip will have its position changed.
#
# LBW::LaheySpace implements a wrapping as defined in befunge specs -
# ie, when hitting a bound of the storage, the ip reverses and
# backtraces until it bumps into another bound, and then it reverses one
# last time to keep its velocity.
#
sub wrap {
    my ($self, $storage, $ip) = @_;

    # fetch the current position/velocity of the ip.
    my $v = $ip->get_position;
    my $d = $ip->get_delta;

    # fetch the storage min / max
    my $min = $storage->min;
    my $max = $storage->max;

    # funge98 says we should walk our current trajectory in reverse,
    # until we hit the other side of the storage, and then continue
    # along the same path.
    do {
        $v -= $d;
    } while ( $v->bounds_check($min, $max) );

    # now that we've hit the wall, walk back into the valid code range.
    $v += $d;

    # store new position.
    $ip->set_position($v);
}

1;
__END__