VList: Difference between revisions
Content added Content deleted
m (→{{header|Perl 6}}: insignificant shortening) |
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
||
Line 827: | Line 827: | ||
Mike 1 3 |
Mike 1 3 |
||
1 Fred 4 |
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 is default(vSeg.new(ele=>())); |
|||
has Int $.offset is rw is default(0) ; |
|||
method Index(Int $i is copy --> vEle) { # method to locate the kth element |
|||
if $i ≥ 0 { |
|||
loop ( $i += self.offset, $_ = self.base; $_.defined; $_ := $_.next) { |
|||
($i < my $len = .ele.elems) ?? return .ele[$i] !! $i -= $len |
|||
} |
|||
} |
|||
die "index out of range" |
|||
} |
|||
method cons(vEle \a --> vList) { # method to add an element to the front |
|||
if not self.base.ele.Bool { # probably faster than .elems ? |
|||
self.base.ele.push: a ; |
|||
return self; |
|||
} elsif self.offset == 0 { |
|||
my \L2offset = (self.base.ele.elems * 2) - 1 ; |
|||
my \s = vSeg.new(next => self.base, ele => flat Nil xx L2offset, a); |
|||
return vList.new(base => s, offset => L2offset ) |
|||
} |
|||
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; |
|||
return self if ++self.offset < self.base.ele.elems; |
|||
return vList.new(base => self.base.next) |
|||
} |
|||
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.ele.Bool; |
|||
my @sl = self.base.ele[self.offset .. *]; |
|||
loop ($_=self.base.next; $_.defined; $_:=$_.next) { @sl.append: .ele } |
|||
return "[" ~ @sl.Str ~ "]" |
|||
} |
|||
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> |
</pre> |
||
Line 1,067: | Line 957: | ||
See https://github.com/takikawa/tr-pfds/blob/master/pfds/vlist.rkt |
See https://github.com/takikawa/tr-pfds/blob/master/pfds/vlist.rkt |
||
for an implementation of VLists. |
for an implementation of VLists. |
||
=={{header|Raku}}== |
|||
(formerly 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 is default(vSeg.new(ele=>())); |
|||
has Int $.offset is rw is default(0) ; |
|||
method Index(Int $i is copy --> vEle) { # method to locate the kth element |
|||
if $i ≥ 0 { |
|||
loop ( $i += self.offset, $_ = self.base; $_.defined; $_ := $_.next) { |
|||
($i < my $len = .ele.elems) ?? return .ele[$i] !! $i -= $len |
|||
} |
|||
} |
|||
die "index out of range" |
|||
} |
|||
method cons(vEle \a --> vList) { # method to add an element to the front |
|||
if not self.base.ele.Bool { # probably faster than .elems ? |
|||
self.base.ele.push: a ; |
|||
return self; |
|||
} elsif self.offset == 0 { |
|||
my \L2offset = (self.base.ele.elems * 2) - 1 ; |
|||
my \s = vSeg.new(next => self.base, ele => flat Nil xx L2offset, a); |
|||
return vList.new(base => s, offset => L2offset ) |
|||
} |
|||
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; |
|||
return self if ++self.offset < self.base.ele.elems; |
|||
return vList.new(base => self.base.next) |
|||
} |
|||
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.ele.Bool; |
|||
my @sl = self.base.ele[self.offset .. *]; |
|||
loop ($_=self.base.next; $_.defined; $_:=$_.next) { @sl.append: .ele } |
|||
return "[" ~ @sl.Str ~ "]" |
|||
} |
|||
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> |
|||
=={{header|REXX}}== |
=={{header|REXX}}== |