Task

Given a prompt and a list containing a number of strings of which one is to be selected, create a function that:

 prints a textual menu formatted as an index value followed by its corresponding string for each item in the list;
 prompts the user to enter a number;
 returns the string corresponding to the selected index number.


The function should reject input that is not an integer or is out of range by redisplaying the whole menu before asking again for a number. The function should return an empty string if called with an empty list.

For test purposes use the following four phrases in a list:

   fee fie
   huff and puff
   mirror mirror
   tick tock

Note

This task is fashioned after the action of the Bash select statement.

def _menu (string<> items)
	for (decl int i) (< i (size items)) (inc i)
		out "  " i ") " items<i> endl console
	end for
end _menu
 
def _ok (string reply, int itemcount)
	try
		decl int n
		set n (int reply)
		return (and (or (> n 0) (= n 0)) (< n itemcount))
	catch
		return false
	end try
end _ok
 
def selector (string<> items, string prompt)
	# Prompt to select an item from the items
	if (= (size items) 0)
		return ""
	end if
	decl int itemcount reply
	set reply -1
	set itemcount (size items)
	while (not (_ok reply itemcount))
		_menu items
		out prompt console
		set reply (in int console)
	end while
	return items<(int reply)>
end selector
 
decl string<> items
append "fee fie" "huff and puff" "mirror mirror" "tick tock" items
decl string item
set item (selector items "Which is from the three pigs: ")
out "You chose: " item endl console