perl: Factor out common features of Vectors and Lists into a superclass.
authorBen Harris <bjh21@bjh21.me.uk>
Tue, 23 Jul 2019 20:25:20 +0000 (21:25 +0100)
committerBen Harris <bjh21@bjh21.me.uk>
Thu, 25 Jul 2019 22:43:47 +0000 (23:43 +0100)
The two classes are identical apart from their names.

perl/types.pm

index 4eba2b3..450fee2 100644 (file)
@@ -126,10 +126,10 @@ sub _keyword_Q { ((ref $_[0]) =~ /^String/) && ${$_[0]} =~ /^\x{029e}/; }
 }
 
 
-# Lists
+# Sequences
 
 {
-    package List;
+    package Sequence;
     sub new  { my $class = shift; bless {'meta'=>$nil, 'val'=>$_[0]}, $class }
     sub nth { $_[0]->{val}->[$_[1]]; }
     #sub _val { $_[0]->{val}->[$_[1]]->{val}; } # return value of nth item
@@ -137,6 +137,13 @@ sub _keyword_Q { ((ref $_[0]) =~ /^String/) && ${$_[0]} =~ /^\x{029e}/; }
     sub slice { my @arr = @{$_[0]->{val}}; List->new([@arr[$_[1]..$_[2]]]); }
 }
 
+# Lists
+
+{
+    package List;
+    use parent -norequire, 'Sequence';
+}
+
 sub _list_Q { (ref $_[0]) =~ /^List/ }
 
 
@@ -144,11 +151,7 @@ sub _list_Q { (ref $_[0]) =~ /^List/ }
 
 {
     package Vector;
-    sub new  { my $class = shift; bless {'meta'=>$nil, 'val'=>$_[0]}, $class }
-    sub nth { $_[0]->{val}->[$_[1]]; }
-    #sub _val { $_[0]->{val}->[$_[1]]->{val}; } # return value of nth item
-    sub rest { my @arr = @{$_[0]->{val}}; List->new([@arr[1..$#arr]]); }
-    sub slice { my @arr = @{$_[0]->{val}}; List->new([@arr[$_[1]..$_[2]]]); }
+    use parent -norequire, 'Sequence';
 }
 
 sub _vector_Q { (ref $_[0]) =~ /^Vector/ }