functor
import
System
Application
define
local Args N Size L1 L2 L3 Temp Result in
{Application.getCmdArgs plain Args}
if {List.length Args} \= 1 then
N = 1
else
{String.toInt Args.1 N}
end
Size = 10000
L1 = {NewCell nil}
L2 = {NewCell nil}
L3 = {NewCell nil}
Temp = {NewCell nil}
Result = {NewCell 0}
proc {MyMain Q}
%%
%first create a list (L1) of integers from 1 through SIZE (SIZE is currently defined as 10000).
{Assign L1 {List.number 1 Size 1}}
%copy L1 to L2 (can use any builtin list copy function, if available)
{Assign L2 {Access L1}}
%remove each individual item from left side (head) of L2 and append to right side (tail)
% of L3 (preserving order). (L2 should be emptied by one item at a time as that item is
% appended to L3).
{For 1 (Size - 1) 1
proc {$ N}
{Assign Temp {List.nth {Access L2} 1}}
{Assign L2 {List.drop {Access L2} 1}}
{Assign L3 {List.append {Access L3} {Access Temp}|nil}}
end}
%remove each individual item from right side (tail) of L3 and append to right side (tail)
% of L2 (reversing list). (L3 should be emptied by one item at a time as that item is
% appended to L2).
{For 1 (Size - 1) 1
proc {$ N}
{Assign Temp {List.last {Access L3}}}
{Assign L3 {List.take {Access L3} {List.length {Access L3}} - 1}}
{Assign L2 {List.append {Access L2} {Access Temp}|nil}}
end}
%reverse L1 (preferably in place) (can use any builtin function for this, if available).
{Assign L1 {List.reverse {Access L1} $}}
%check that first item of L1 is now == SIZE.
if {Value.'\\=' {List.nth {Access L1} 1} Size} then
% {System.showInfo "Equal!"}
% else
{Assign Result 0}
end
%and compare L1 and L2 for equality and return length of L1 (which should be equal to SIZE). `
if {Value.'==' {Access L1} {Access L2}} then
{Assign Result {List.length {Access L1}}}
else
{Assign Result 0}
end
%%
end
{For 1 N 1 MyMain}
{System.showInfo {Access Result}}
{Application.exit 0}
end
end