VList: Difference between revisions

3,645 bytes added ,  2 years ago
Line 929:
@["4", "5"]
@["6"]</pre>
 
=={{header|Objeck}}==
{{trans|Kotlin}}
 
<lang objeck>class vList {
@base : vSeg;
@offset : Int;
 
New() {}
 
New(base : vSeg, offset : Int) {
@base := base;
@offset := offset;
}
 
New(base : vSeg) {
@base := base;
}
 
method : public : GetBase() ~ vSeg {
return @base;
}
 
method : public : GetOffset() ~ Int {
return @offset;
}
 
method : public : Cons(a : String) ~ vList {
if(@base = Nil) {
s := vSeg->New(a);
return vList->New(s);
}
else if(@offset = 0) {
l2 := @base->GetEle()->Size() * 2;
ele := String->New[l2];
ele[l2 - 1] := a;
s := vSeg->New(@base, ele);
return vList->New(s, l2 - 1);
}
else {
@offset -= 1;
ele := @base->GetEle();
ele[@offset] := a;
return @self;
};
}
 
method : public : Cdr() ~ vList {
if(@base = Nil) {
return Nil;
};
 
@offset += 1;
if(@offset < @base->GetEle()->Size()) {
return @self;
}
else {
return vList->New(@base->GetNext(), 0);
};
}
 
method : public : Index(i : Int) ~ String {
if(i >= 0) {
i += @offset;
for(sg := @base; sg <> Nil; sg := sg->GetNext();) {
ele := sg->GetEle();
if(i < ele->Size()) {
return ele[i];
};
i -= ele->Size();
};
};
 
return Nil;
}
 
method : public : Size() ~ Int {
if(@base = Nil) {
return 0;
};
 
return @base->GetEle()->Size() * 2 - @offset - 1;
}
 
method : public : ToString() ~ String {
if(@base = Nil) {
return "[]";
};
 
r := "[";
ele := @base->GetEle();
r += ele[@offset];
r += ' ';
 
sg := @base;
offset := @offset + 1;
done := false;
while(<>done) {
for(i := offset; i < ele->Size(); i += 1;) {
r += ele[i];
r += ' ';
};
 
sg := sg->GetNext();
if(sg <> Nil) {
ele := sg->GetEle();
offset := 0;
}
else {
done := true;
};
};
r += ']';
 
return r;
}
 
method : public : PrintStructure() ~ Nil {
offset := @offset;
" offset: {$offset}"->PrintLine();
for(sg := @base; sg <> Nil; sg := sg->GetNext();) {
values := sg->GetEle();
" ["->Print();
each(i : values) {
value := values[i];
if(value <> Nil) {
"{$value}"->Print();
}
else {
"{Nil}"->Print();
};
 
if(i + 1 < values->Size()) {
", "->Print();
};
};
"]"->PrintLine();
};
""->PrintLine();
}
}
class vSeg {
@next : vSeg;
@ele : String[];
 
New(next : vSeg, ele : String[]) {
@next := next;
@ele := ele;
}
 
New(s : String) {
@ele := String->New[1];
@ele[0] := s;
}
 
method : public : GetNext() ~ vSeg {
return @next;
}
 
method : public : GetEle() ~ String[] {
return @ele;
}
}
 
class Test {
function : Main(args : String[]) ~ Nil {
v := vList->New();
"Zero value for type. empty vList: {$v}"->PrintLine();
v->PrintStructure();
 
for(a := '6'; a >= '1'; a -=1;) {
v := v->Cons("{$a}");
};
"Demonstrate cons. 6 elements added: {$v}"->PrintLine();
v->PrintStructure();
 
v := v->Cdr();
"Demonstrate cdr. 1 element removed: {$v}"->PrintLine();
v->PrintStructure();
 
size := v->Size();
"Demonstrating size property, size = {$size}"->PrintLine();
 
e := v->Index(3);
"Demonstrate element access. v[3] = {$e}"->PrintLine();
 
v := v->Cdr()->Cdr();
"Demonstrate cdr. 2 elements removed: {$v}"->PrintLine();
v->PrintStructure();
}
}</lang>
 
=={{header|ooRexx}}==
760

edits