Avoiding side effects
- From: Anders Wirzenius <anders@xxxxxxxxxxxxxxxxxxxxxxx>
- Date: Tue, 30 Sep 2008 05:50:18 GMT
Another thread about functions and side effects triggered me to
ask advice how to solve a specific problem without using side effects.
Problem:
Two files A and B containing one code per line (actually a
material number). I want to have the difference between those
files (A-B), i.e. remove those lines in A that are mentioned in
B.
B may contain codes that are not present in A.
A and B contain up to 1.5 million lines each.
My solution:
I sort the files alphabetically and remove possible duplicates
(Unix commands sort and uniq).
I create two functions, Strip and Advance.
function Strip (Remove_This : in String) return String
-- Displays rows until row > Remove_This.
function Advance (Candidate : in String) return String
-- Advance in file until row > Candidate.
The main program is then merely a loop where I alternate between
advancing lines in the two files until the row in the file is
greater than the value to compare against:
....
loop
Trans_String := To_Unbounded_String (Strip (To_String
(Trans_String)));
Trans_String := To_Unbounded_String (Advance (To_String
(Trans_String)));
end loop;
The problem is how to deal with the situation when I reach the
end of the file.
I have done it using a side effect:
EOF_Reached : Boolean := False;
loop
Trans_String...
exit when EOF_Reached;
Trans_String...
exit when EOF_Reached;
end loop;
-- Display possible tail of file A.
EOF_Reached is set to True in the functions Strip and Advance as
a side effect.
Is there a better way without using the side effect EOF_Reached?
--
Anders
.
- Follow-Ups:
- Re: Avoiding side effects
- From: Ludovic Brenta
- Re: Avoiding side effects
- From: Jean-Pierre Rosen
- Re: Avoiding side effects
- Prev by Date: Re: Blocking syscalls in Tasks
- Next by Date: Re: Ada on Mac
- Previous by thread: SIGAda 2008 Conference Registration Deadlines Fast Approaching!
- Next by thread: Re: Avoiding side effects
- Index(es):
Relevant Pages
|