VList: Difference between revisions

3,282 bytes added ,  4 years ago
added Perl 6 programming solution
(added Perl 6 programming solution)
Line 827:
Mike 1 3
1 Fred 4
</pre>
 
=={{header|Perl 6}}==
{{trans|Go}}
{{trans|Kotlin}}
<lang perl6>#!/usr/bin/env perl6
 
class vList {
 
subset vEle of Any; # or Str
 
class vSeg {
has $.next is rw is default(Nil) ;
has vEle @.ele is rw ;
}
 
has vSeg $.base is rw ;
has Int $.offset is rw is default(0) ;
 
submethod BUILD () { self.base = vSeg.new(ele=>()) } # default() this as well?
 
method Index(Int $i is copy --> vEle) { # method to locate the kth element
if $i = 0 {
$i += self.offset;
loop ( $_ = self.base; $_.defined; $_ := $_.next) {
return .ele[$i] if $i < .ele.elems;
$i -= .ele.elems
}
}
die "index out of range"
}
 
method cons(vEle \a --> vList) { # method to add an element to the front
if self.base.ele.elems == 0 {
self.base.ele.push: a ;
return self;
}
if self.offset == 0 {
my \l2 = self.base.ele.elems * 2 ;
my vEle @ele = Nil xx l2 ;
@ele[l2-1] = a ;
my \v = vList.new;
my \s = vSeg.new;
s.next = self.base;
s.ele = @ele;
v.base = s;
v.offset = l2 - 1 ;
return v
}
self.offset--;
self.base.ele[self.offset] = a;
return self
}
 
# obtain a new array beginning at the second element of an old array
method cdr(--> vList) {
die "cdr on empty vList" unless self.base.defined;
self.offset++;
return self if self.offset < self.base.ele.elems;
my \v = vList.new();
v.base = self.base.next;
return v
}
 
method Length(--> Int) { # method to compute the length of the list
return 0 unless self.base.defined;
return self.base.ele.elems*2 - self.offset - 1
}
 
method gist { # (mis)used to create output similar to Go/Kotlin
return '[]' unless self.base.defined;
my $r = "[" ~ self.base.ele[self.offset]; # warning
my $sg := self.base;
my @sl := self.base.ele[self.offset+1 .. *];
loop {
{ $r ~= " $_".Str } for @sl;
$sg := $sg.next;
last unless $sg.defined;
@sl := $sg.ele
}
return $r ~ "]"
}
 
method printStructure { # One more method for demonstration purposes
say "offset: ", self.offset;
loop ( $_ = self.base; $_.defined ; $_ := $_.next ) { .ele.say }
}
}
 
my $v := vList.new;
say "zero value for type. empty vList: ", $v;
$v.printStructure;
say " ";
$v := $v.cons($_.Str) for 6 … 1;
say "demonstrate cons. 6 elements added: ", $v;
$v.printStructure;
say " ";
$v := $v.cdr;
say "demonstrate cdr. 1 element removed: ", $v;
$v.printStructure;
say " ";
say "demonstrate length. length = ", $v.Length;
say " ";
say "demonstrate element access. v[3] = ", $v.Index(3) ;
say " ";
$v := $v.cdr.cdr;
say "show cdr releasing segment. 2 elements removed: ", $v;
$v.printStructure;</lang>
{{out}}
<pre>zero value for type. empty vList: []
offset: 0
[]
 
demonstrate cons. 6 elements added: [1 2 3 4 5 6]
offset: 1
[(vEle) 1 2 3]
[4 5]
[6]
 
demonstrate cdr. 1 element removed: [2 3 4 5 6]
offset: 2
[(vEle) 1 2 3]
[4 5]
[6]
 
demonstrate length. length = 5
 
demonstrate element access. v[3] = 5
 
show cdr releasing segment. 2 elements removed: [4 5 6]
offset: 0
[4 5]
[6]
</pre>
 
350

edits