tomo/test/arrays.tm

187 lines
3.2 KiB
Tcl

func main():
do:
>> [:Num32]
= [:Num32]
do:
>> arr := [10, 20, 30]
= [10, 20, 30]
>> arr[1]
= 10
>> arr[-1]
= 30
>> arr.length
= 3
sum := 0
for x in arr:
sum += x
>> sum
= 60
str := ""
for i,x in arr:
str ++= "($i,$x)"
>> str
= "(1,10)(2,20)(3,30)"
do:
>> arr := [10, 20] ++ [30, 40]
= [10, 20, 30, 40]
>> arr ++= [50, 60]
>> arr
= [10, 20, 30, 40, 50, 60]
do:
>> arr := [10, 20]
>> copy := arr
>> arr ++= [30]
>> arr
= [10, 20, 30]
>> copy
= [10, 20]
do:
>> [10*i for i in 5]
= [10, 20, 30, 40, 50]
>> [i*10 for i in 5]
= [10, 20, 30, 40, 50]
>> [i*10 for i in 5 if i mod 2 != 0]
= [10, 30, 50]
>> [x for x in y if x > 1 for y in [3, 4, 5] if y < 5]
= [2, 3, 2, 3, 4]
do:
>> arr := @[10, 20]
>> copy := arr[]
>> arr:insert(30)
>> arr
= @[10, 20, 30]
>> copy
= [10, 20]
>> arr[1] = 999
>> arr
= @[999, 20, 30]
do:
>> arr := &[10, 20, 30]
>> reversed := arr:reversed()
= [30, 20, 10]
# Ensure the copy-on-write behavior triggers:
>> arr[1] = 999
>> reversed
= [30, 20, 10]
do:
>> nums := @[10, -20, 30]
# Sorted function doesn't mutate original:
>> nums:sorted()
= [-20, 10, 30]
>> nums
= @[10, -20, 30]
# Sort function does mutate in place:
>> nums:sort()
>> nums
= @[-20, 10, 30]
# Custom sort functions:
>> nums:sort(func(x,y:&Int): x:abs() <> y:abs())
>> nums
= @[10, -20, 30]
>> nums:sort(func(x,y:&Int): y[] <> x[])
>> nums
= @[30, 10, -20]
>> ["A", "B", "C"]:sample(10, [1.0, 0.5, 0.0])
do:
>> heap := @[random:int(1, 50) for _ in 10]
>> heap:heapify()
>> heap
sorted := @[:Int]
repeat:
sorted:insert(heap:heap_pop() or stop)
>> sorted == sorted:sorted()
= yes
for _ in 10:
heap:heap_push(random:int(1, 50))
>> heap
sorted = @[:Int]
repeat:
sorted:insert(heap:heap_pop() or stop)
>> sorted == sorted:sorted()
= yes
do:
>> [i*10 for i in 5]:from(3)
= [30, 40, 50]
>> [i*10 for i in 5]:to(3)
= [10, 20, 30]
>> [i*10 for i in 5]:to(-2)
= [10, 20, 30, 40]
>> [i*10 for i in 5]:from(-2)
= [40, 50]
>> [i*10 for i in 5]:by(2)
= [10, 30, 50]
>> [i*10 for i in 5]:by(-1)
= [50, 40, 30, 20, 10]
>> [10, 20, 30, 40]:by(2)
= [10, 30]
>> [10, 20, 30, 40]:by(-2)
= [40, 20]
>> [i*10 for i in 10]:by(2):by(2)
= [10, 50, 90]
>> [i*10 for i in 10]:by(2):by(-1)
= [90, 70, 50, 30, 10]
# Test iterating over array:from() and array:to()
xs := ["A", "B", "C", "D"]
for i,x in xs:to(-2):
for y in xs:from(i+1):
say("$(x)$(y)")
do:
>> nums := @[-7, -4, -1, 2, 5]
>> nums:sort()
>> [nums:binary_search(i) for i in nums[]]
= [1, 2, 3, 4, 5]
>> nums:sort(func(a,b:&Int): a:abs() <> b:abs())
>> [nums:binary_search(i, func(a,b:&Int): a:abs() <> b:abs()) for i in nums[]]
= [1, 2, 3, 4, 5]
>> ["a", "b", "c"]:find("b")
= 2?
>> ["a", "b", "c"]:find("XXX")
= none:Int
>> [10, 20]:first(func(i:&Int): i:is_prime())
= none:Int
>> [4, 5, 6]:first(func(i:&Int): i:is_prime())
= 2?
do:
>> nums := &[10, 20, 30, 40, 50]
>> nums:pop()
= 50?
>> nums
= &[10, 20, 30, 40]
>> nums:pop(2)
= 20?
>> nums
= &[10, 30, 40]
>> nums:clear()
>> nums
= &[:Int]
>> nums:pop()
= none:Int