Iterating on a LIST
There are three Eiffel mechanisms to iterate on every element of a LIST.
the across loop
The across can be used on every ITERABLE object (including LIST objects).
print_elements (a_list: LIST[INTEGER])
-- Print every elements on `a_list`
do
across a_list as ic loop
print (ic.item.out + "%N")
end
end
Note that the temporary variable (ic in the example) represents an iterator of the ITERABLE object, and not directly an element like in many other languages (like the for structure in Python for example).
the from until loop syntax
This syntax offer more possibilities than the across loop, but is riskier.
print_elements (a_list:LIST[INTEGER])
-- Print every elements on `a_list`
do
from
a_list.start
until
a_list.exhausted
loop
print (a_list.item.out + "%N")
a_list.forth
end
end
Using Eiffel agents and {LIST}.do_all, ....
It is possible to use agents in conjunction with the LIST features do_all, do_if, there_exists, and for_all which are inherited from the class LINEAR.
list_traversal_agents
-- Example of traversing a list with do_all
local
a_list: LINKED_LIST [STRING]
do
-- Insert some elements in a_list
create a_list.make
a_list.extend ("The Moon Is Full")
a_list.extend ("Master charge")
a_list.extend ("Black cat bone")
a_list.do_all (agent {STRING}.append (" - Albert Collins"))
a_list.do_all (agent print_element)
end
print_element (a_element: STRING)
-- Print `a_element` to standard output
do
io.put_string (a_element)
io.put_new_line
end