1
package Language::INTERCAL::SharkFin;
3
# Special version of Language::INTERCAL::Arrays used for "Shark Fin"
6
# This file is part of CLC-INTERCAL
8
# Copyright (c) 2006 Claudio Calvelli, all rights reserved.
10
# CLC-INTERCAL is copyrighted software. However, permission to use, modify,
11
# and distribute it is granted provided that the conditions set out in the
12
# licence agreement are met. See files README and COPYING in the distribution.
15
use vars qw($PERVERSION);
16
$PERVERSION = "CLC-INTERCAL INTERCAL/SharkFin.pm 1.-94.-4";
20
use Language::INTERCAL::Exporter '1.-94.-4';
21
use Language::INTERCAL::Splats '1.-94.-4', qw(:SP);
22
use Language::INTERCAL::Arrays '1.-94.-4';
25
@ISA = qw(Language::INTERCAL::Arrays::Tail);
28
vector => [\&_code_vector, \&_decode_vector],
33
or croak "Usage: Language::INTERCAL::SharkFin->new(TYPE, OBJECT [,VALUE])";
34
my ($class, $type, $object, @value) = @_;
35
exists $types{$type} or faint(SP_SPECIAL, "(type $type)");
38
@value = &{$types{$type}[0]}($object, @value);
39
# note, we don't use SUPER here, rather we rebless later
40
$arr = Language::INTERCAL::Arrays::Tail->from_list(\@value);
42
$arr = Language::INTERCAL::Arrays::Tail->new([]);
46
type => $types{$type}[0],
48
decode => $types{$type}[1],
54
@_ == 1 or croak "Usage: SHARKFIN->type";
56
$arr->{sharkfin}{typename};
60
@_ == 2 or croak "Usage: SHARKFIN->assign(VALUE)";
61
my ($arr, $value) = @_;
62
exists $arr->{sharkfin} or faint(SP_NOSPECIAL);
63
$arr->{sharkfin}{type} or faint(SP_NOSPECIAL);
64
my @value = &{$arr->{sharkfin}{type}}($arr->{sharkfin}{object}, $value);
65
$arr->SUPER::_assign(@value ? [scalar @value] : []);
66
for (my $i = 1; $i <= @value; $i++) {
67
$arr->_store([$i], $value[$i - 1]);
74
return $value->spot->number
75
if ref $value && UNIVERSAL::isa($value, 'Language::INTERCAL::Numbers');
77
if ! ref $value && defined $value && $value =~ /^\d+$/;
78
faint(SP_INVARRAY, 'Not a number');
82
my ($object, $value) = @_;
84
return (( map { _get_number($_) } @$value ))
85
if ref $value eq 'ARRAY';
86
return ( $value->spot->number )
87
if UNIVERSAL::isa($value, 'Language::INTERCAL::Numbers');
88
return ((map { $_->spot->number } $value->tail->as_list))
89
if UNIVERSAL::isa($value, 'Language::INTERCAL::Arrays');
90
faint(SP_NOARRAY, "Not an array");
93
return (unpack('C*', $value));
95
faint(SP_NOARRAY, "Not an array");
99
my ($object, $value) = @_;
100
my @list = map { $_->number } $value->as_list;
101
pop @list while @list && $list[-1] == 0;
102
my $list = pack('C*', @list);
103
$list =~ s/([\\'])/\\$1/g;
104
$list = "'$list'" if $list =~ /['\s\\]/;
109
@_ == 1 or croak "Usage: SHARKFIN->print";
111
my $s = $arr->{sharkfin};
112
return &{$s->{decode}}($s->{object}, $arr) if $s->{decode};
117
@_ == 3 or croak "Usage: SHARKFIN->range(START, LEN)";
118
my ($arr, $start, $len) = @_;
119
# we just rebless it to a Tail and use their range()
120
bless $arr, 'Language::INTERCAL::Arrays::Tail';
121
$arr->range($start, $len);