VList: Difference between revisions
Content added Content deleted
Line 933: | Line 933: | ||
{{trans|Kotlin}} |
{{trans|Kotlin}} |
||
⚫ | |||
Will refactor to use generic types. |
|||
⚫ | |||
⚫ | |||
⚫ | |||
@offset : Int; |
@offset : Int; |
||
New() {} |
New() {} |
||
New(base : vSeg, offset : Int) { |
New(base : vSeg<T>, offset : Int) { |
||
@base := base; |
@base := base; |
||
@offset := offset; |
@offset := offset; |
||
} |
} |
||
New(base : vSeg) { |
New(base : vSeg<T>) { |
||
@base := base; |
@base := base; |
||
} |
} |
||
method : public : GetBase() ~ vSeg { |
method : public : GetBase() ~ vSeg<T> { |
||
return @base; |
return @base; |
||
} |
} |
||
Line 958: | Line 956: | ||
} |
} |
||
method : public : Cons(a : |
method : public : Cons(a : T) ~ vList<T> { |
||
if(@base = Nil) { |
if(@base = Nil) { |
||
return vList->New(vSeg->New(a)); |
return vList->New(vSeg->New(a)<T>)<T>; |
||
} |
} |
||
else if(@offset = 0) { |
else if(@offset = 0) { |
||
l2 := @base->GetEle()->Size() * 2; |
l2 := @base->GetEle()->Size() * 2; |
||
ele := |
ele := T->New[l2]; |
||
ele[l2 - 1] := a; |
ele[l2 - 1] := a; |
||
return vList->New(vSeg->New(@base, ele), l2 - 1); |
return vList->New(vSeg->New(@base, ele)<T>, l2 - 1)<T>; |
||
} |
} |
||
else { |
else { |
||
Line 976: | Line 974: | ||
} |
} |
||
method : public : Cdr() ~ vList { |
method : public : Cdr() ~ vList<T> { |
||
if(@base = Nil) { |
if(@base = Nil) { |
||
return Nil; |
return Nil; |
||
Line 986: | Line 984: | ||
} |
} |
||
else { |
else { |
||
return vList->New(@base->GetNext(), 0); |
return vList->New(@base->GetNext(), 0)<T>; |
||
}; |
}; |
||
} |
} |
||
method : public : Index(i : Int) ~ |
method : public : Index(i : Int) ~ T { |
||
if(i >= 0) { |
if(i >= 0) { |
||
i += @offset; |
i += @offset; |
||
Line 1,021: | Line 1,019: | ||
r := "["; |
r := "["; |
||
ele := @base->GetEle(); |
ele := @base->GetEle(); |
||
r += ele[@offset]; |
r += ele[@offset]->ToString(); |
||
r += ' '; |
r += ' '; |
||
Line 1,030: | Line 1,028: | ||
while(<>done) { |
while(<>done) { |
||
for(i := offset; i < ele->Size(); i += 1;) { |
for(i := offset; i < ele->Size(); i += 1;) { |
||
r += ele[i]; |
r += ele[i]->ToString(); |
||
r += ' '; |
r += ' '; |
||
}; |
}; |
||
Line 1,074: | Line 1,072: | ||
} |
} |
||
class vSeg { |
class vSeg<T:Stringify> { |
||
@next : vSeg; |
@next : vSeg<T>; |
||
@ele : |
@ele : T[]; |
||
New(next : vSeg, ele : |
New(next : vSeg<T>, ele : T[]) { |
||
@next := next; |
@next := next; |
||
@ele := ele; |
@ele := ele; |
||
} |
} |
||
New(s : |
New(s : T) { |
||
@ele := |
@ele := T->New[1]; |
||
@ele[0] := s; |
@ele[0] := s; |
||
} |
} |
||
method : public : GetNext() ~ vSeg { |
method : public : GetNext() ~ vSeg<T> { |
||
return @next; |
return @next; |
||
} |
} |
||
method : public : GetEle() ~ |
method : public : GetEle() ~ T[] { |
||
return @ele; |
return @ele; |
||
} |
} |
||
Line 1,099: | Line 1,097: | ||
class Test { |
class Test { |
||
function : Main(args : String[]) ~ Nil { |
function : Main(args : String[]) ~ Nil { |
||
v := vList->New(); |
v := vList->New()<String>; |
||
"Zero value for type. empty vList: {$v}"->PrintLine(); |
"Zero value for type. empty vList: {$v}"->PrintLine(); |
||
v->PrintStructure(); |
v->PrintStructure(); |
||
for(a := '6'; a >= '1'; a -=1;) { |
for(a := '6'; a >= '1'; a -=1;) { |
||
v := v->Cons("{$a}"); |
v := v->Cons("{$a}")<String>; |
||
}; |
}; |
||
"Demonstrate cons. 6 elements added: {$v}"->PrintLine(); |
"Demonstrate cons. 6 elements added: {$v}"->PrintLine(); |
||
v->PrintStructure(); |
v->PrintStructure(); |
||
v := v->Cdr(); |
v := v->Cdr()<String>; |
||
Runtime->Assert(v <> Nil); |
Runtime->Assert(v <> Nil); |
||
"Demonstrate cdr. 1 element removed: {$v}"->PrintLine(); |
"Demonstrate cdr. 1 element removed: {$v}"->PrintLine(); |
||
Line 1,121: | Line 1,120: | ||
"Demonstrate element access. v[3] = {$e}"->PrintLine(); |
"Demonstrate element access. v[3] = {$e}"->PrintLine(); |
||
v := v->Cdr()->Cdr(); |
v := v->Cdr()<String>->Cdr()<String>; |
||
Runtime->Assert(v <> Nil); |
Runtime->Assert(v <> Nil); |
||
"Demonstrate cdr. 2 elements removed: {$v}"->PrintLine(); |
"Demonstrate cdr. 2 elements removed: {$v}"->PrintLine(); |