```# \$Id: lists.pliant,v 1.0 2002/02/08 10:09:00 dada Exp \$

module "/pliant/language/context.pli"

gvar Int SIZE := 10000

function reverse l -> r
arg List:Int l
arg List:Int r
var Pointer:Int v
v :> l last
for (var Int i) l:size-1 0 step -1
r += v
v :> l previous v
return r

function test_lists -> r
arg Int r
var List:Int Li1
var List:Int Li2
var List:Int Li3
var Pointer:Int v
var Int len1
var Int len2
var Bool lists_equal := true
var Pointer:Int v1
var Pointer:Int v2

# create a list of integers (Li1) from 1 to SIZE
for (var Int i) 1 SIZE
Li1 += i

# copy the list to Li2 (not by individual items)
Li2 := Li1

# remove each individual item from left side of Li2 and
# append to right side of Li3 (preserving order)
while Li2:size > 0
v :> Li2 first
Li3 += v
Li2 -= v

# Li2 must now be empty
# remove each individual item from right side of Li3 and
# append to right side of Li2 (reversing list)
while Li3:size > 0
v :> Li3 last
Li2 += v
Li3 -= v

# Li3 must now be empty
# reverse Li1 in place
Li1 := reverse Li1

# check that first item is now SIZE
v :> Li1 first
if v <> SIZE
return 0

# compare Li1 and Li2 for equality
len1 := Li1:size
len2 := Li2:size
lists_equal := (len1=len2)
v1 :> Li1 first
v2 :> Li2 first
for (var Int i) 0 len1-1
if v1 <> v2
lists_equal := false
i := len1-1
v1 :> Li1 next v1
v2 :> Li2 next v2
if lists_equal = false
return 0
return len1

gvar Int r
gvar Str s_n := cast ((pliant_script_args translate Address 1) map CStr) Str
if (s_n parse (gvar Int n))
while n > 0
r := test_lists
n := n - 1
console r eol
else
console "usage: lists.pliant <number>" eol

```