|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class node |
|
{ |
|
rule __init__ ( |
|
value ? |
|
) |
|
{ |
|
self.value = $(value) ; |
|
} |
|
|
|
|
|
|
|
rule set ( value * ) |
|
{ |
|
self.value = $(value) ; |
|
} |
|
|
|
|
|
|
|
rule get ( ) |
|
{ |
|
return $(self.value) ; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class vector : node |
|
{ |
|
import numbers ; |
|
import utility ; |
|
import sequence ; |
|
|
|
rule __init__ ( |
|
values * |
|
) |
|
{ |
|
node.__init__ ; |
|
self.value = $(values) ; |
|
} |
|
|
|
|
|
|
|
rule front ( ) |
|
{ |
|
return $(self.value[1]) ; |
|
} |
|
|
|
|
|
|
|
rule back ( ) |
|
{ |
|
return $(self.value[-1]) ; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rule at ( |
|
index |
|
: * |
|
) |
|
{ |
|
local r = $(self.value[$(index)]) ; |
|
if $(2) |
|
{ |
|
r = [ $(r).at $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ] ; |
|
} |
|
return $(r) ; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
rule get-at ( |
|
index |
|
: * |
|
) |
|
{ |
|
local r = $(self.value[$(index)]) ; |
|
if $(2) |
|
{ |
|
r = [ $(r).at $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ] ; |
|
} |
|
return [ $(r).get ] ; |
|
} |
|
|
|
|
|
|
|
|
|
rule push-front ( |
|
value |
|
) |
|
{ |
|
self.value = $(value) $(self.value) ; |
|
} |
|
|
|
|
|
|
|
|
|
rule pop-front ( ) |
|
{ |
|
self.value = $(self.value[2-]) ; |
|
} |
|
|
|
|
|
|
|
rule push-back ( |
|
value |
|
) |
|
{ |
|
self.value += $(value) ; |
|
} |
|
|
|
|
|
|
|
|
|
rule pop-back ( ) |
|
{ |
|
self.value = $(self.value[1--2]) ; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
rule insert ( |
|
index |
|
: value |
|
) |
|
{ |
|
local left = $(self.value[1-$(index)]) ; |
|
local right = $(self.value[$(index)-]) ; |
|
if $(right)-is-not-empty |
|
{ |
|
left = $(left[1--2]) ; |
|
} |
|
self.value = $(left) $(value) $(right) ; |
|
} |
|
|
|
|
|
|
|
|
|
rule erase ( |
|
start |
|
end ? |
|
) |
|
{ |
|
end ?= $(start) ; |
|
local left = $(self.value[1-$(start)]) ; |
|
left = $(left[1--2]) ; |
|
local right = $(self.value[$(end)-]) ; |
|
right = $(right[2-]) ; |
|
self.value = $(left) $(right) ; |
|
} |
|
|
|
|
|
|
|
rule clear ( ) |
|
{ |
|
self.value = ; |
|
} |
|
|
|
|
|
|
|
rule size ( ) |
|
{ |
|
return [ sequence.length $(self.value) ] ; |
|
} |
|
|
|
|
|
|
|
rule empty ( ) |
|
{ |
|
if ! $(self.value)-is-not-empty |
|
{ |
|
return true ; |
|
} |
|
} |
|
|
|
|
|
|
|
rule str ( ) |
|
{ |
|
return "[" [ sequence.transform utility.str : $(self.value) ] "]" ; |
|
} |
|
|
|
|
|
|
|
rule sort ( ) |
|
{ |
|
self.value = [ sequence.insertion-sort $(self.value) : utility.less ] ; |
|
} |
|
|
|
|
|
|
|
|
|
rule equal ( another ) |
|
{ |
|
local mismatch ; |
|
local size = [ size ] ; |
|
if $(size) = [ $(another).size ] |
|
{ |
|
for local i in [ numbers.range 1 $(size) ] |
|
{ |
|
if ! [ utility.equal [ at $(i) ] [ $(another).at $(i) ] ] |
|
{ |
|
mismatch = true ; |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
mismatch = true ; |
|
} |
|
|
|
if ! $(mismatch) |
|
{ |
|
return true ; |
|
} |
|
} |
|
} |
|
|
|
|
|
rule __test__ ( ) |
|
{ |
|
import assert ; |
|
import "class" : new ; |
|
|
|
local v1 = [ new vector ] ; |
|
assert.true $(v1).equal $(v1) ; |
|
assert.true $(v1).empty ; |
|
assert.result 0 : $(v1).size ; |
|
assert.result "[" "]" : $(v1).str ; |
|
$(v1).push-back b ; |
|
$(v1).push-front a ; |
|
assert.result "[" a b "]" : $(v1).str ; |
|
assert.result a : $(v1).front ; |
|
assert.result b : $(v1).back ; |
|
$(v1).insert 2 : d ; |
|
$(v1).insert 2 : c ; |
|
$(v1).insert 4 : f ; |
|
$(v1).insert 4 : e ; |
|
$(v1).pop-back ; |
|
assert.result 5 : $(v1).size ; |
|
assert.result d : $(v1).at 3 ; |
|
$(v1).pop-front ; |
|
assert.result c : $(v1).front ; |
|
assert.false $(v1).empty ; |
|
$(v1).erase 3 4 ; |
|
assert.result 2 : $(v1).size ; |
|
|
|
local v2 = [ new vector q w e r t y ] ; |
|
assert.result 6 : $(v2).size ; |
|
$(v1).push-back $(v2) ; |
|
assert.result 3 : $(v1).size ; |
|
local v2-alias = [ $(v1).back ] ; |
|
assert.result e : $(v2-alias).at 3 ; |
|
$(v1).clear ; |
|
assert.true $(v1).empty ; |
|
assert.false $(v2-alias).empty ; |
|
$(v2).pop-back ; |
|
assert.result t : $(v2-alias).back ; |
|
|
|
local v3 = [ new vector ] ; |
|
$(v3).push-back [ new vector 1 2 3 4 5 ] ; |
|
$(v3).push-back [ new vector a b c ] ; |
|
assert.result "[" "[" 1 2 3 4 5 "]" "[" a b c "]" "]" : $(v3).str ; |
|
$(v3).push-back [ new vector [ new vector x y z ] [ new vector 7 8 9 ] ] ; |
|
assert.result 1 : $(v3).at 1 : 1 ; |
|
assert.result b : $(v3).at 2 : 2 ; |
|
assert.result a b c : $(v3).get-at 2 ; |
|
assert.result 7 8 9 : $(v3).get-at 3 : 2 ; |
|
|
|
local v4 = [ new vector 4 3 6 ] ; |
|
$(v4).sort ; |
|
assert.result 3 4 6 : $(v4).get ; |
|
assert.false $(v4).equal $(v3) ; |
|
|
|
local v5 = [ new vector 3 4 6 ] ; |
|
assert.true $(v4).equal $(v5) ; |
|
|
|
$(v5).pop-back ; |
|
assert.false $(v4).equal $(v5) ; |
|
|
|
local v6 = [ new vector [ new vector 1 2 3 ] ] ; |
|
assert.true $(v6).equal [ new vector [ new vector 1 2 3 ] ] ; |
|
|
|
local v7 = [ new vector 111 222 333 ] ; |
|
assert.true $(v7).equal $(v7) ; |
|
$(v7).insert 4 : 444 ; |
|
assert.result 111 222 333 444 : $(v7).get ; |
|
$(v7).insert 999 : xxx ; |
|
assert.result 111 222 333 444 xxx : $(v7).get ; |
|
|
|
local v8 = [ new vector "" "" "" ] ; |
|
assert.true $(v8).equal $(v8) ; |
|
assert.false $(v8).empty ; |
|
assert.result 3 : $(v8).size ; |
|
assert.result "" : $(v8).at 1 ; |
|
assert.result "" : $(v8).at 2 ; |
|
assert.result "" : $(v8).at 3 ; |
|
assert.result : $(v8).at 4 ; |
|
$(v8).insert 2 : 222 ; |
|
assert.result 4 : $(v8).size ; |
|
assert.result "" 222 "" "" : $(v8).get ; |
|
$(v8).insert 999 : "" ; |
|
assert.result 5 : $(v8).size ; |
|
assert.result "" 222 "" "" "" : $(v8).get ; |
|
$(v8).insert 999 : xxx ; |
|
assert.result 6 : $(v8).size ; |
|
assert.result "" 222 "" "" "" xxx : $(v8).get ; |
|
|
|
|
|
|
|
local v9 = [ new vector 111 xxx 222 ] ; |
|
local v10 = [ new vector 111 yyy 222 ] ; |
|
assert.false $(v9).equal $(v10) ; |
|
} |
|
|