Re: [DOS] Can we emulate "pass by reference" in Eu?
- Posted by Derek Parnell <ddparnell at bigpond.com> Oct 19, 2004
- 526 views
Alex Caracatsanis wrote: > > Dear List > > For my general knowledge, rather than with a specific program in mind, I'd > like to > ask how to pass a non-global variable (two scenario's: an atom; a sequence) as > an argument > to: > 1 a procedure that changes the variable (eg increments it) > 2 a function that changes the variable (eg increments it) but returns some > other, different, > variable > > A "minimal" example to achieve the above, would be enough. > File name "mem.e" ... ----------------------
sequence Mem, MemUse Mem = {} MemUse = {} global function NewRef() integer lPos lPos = find(0, MemUse) if lPos = 0 then Mem &= 0 MemUse &= 0 lPos= length(Mem) end if MemUse[lPos] = 1 Mem[lPos] = 0 return lPos end function global procedure FreeRef(integer pPos) MemUse[pPos] = 0 Mem[pPos] = 0 end procedure global function GetRefData(integer pPos) return Mem[pPos] end function global procedure SetRefData(integer pPos, object pData) Mem[pPos] = pData end procedure
-------------------- File name: "test.ex" which uses "mem.e" ... --------------------
include mem.e -------------------------- function addCustomer( sequence pNewCust) -------------------------- integer lNewRef lNewRef = NewRef() SetRefData( lNewRef, pNewCust ) return lNewRef end function -------------------------- function calcInterest( integer pCustRef ) -------------------------- sequence lCust atom lInterest atom lRate lCust = GetRefData( pCustRef ) if lCust[4] = 'A' then lRate = 0.1025 elsif lCust[4] = 'G' then lRate = 0.1550 else lRate = 0.0 end if lInterest = floor((lCust[3] * lRate) * 100) / 100 lCust[3] += lInterest SetRefData(pCustRef, lCust) return lInterest end function -------------------------- procedure displayCust( integer pCustRef ) -------------------------- sequence lCust lCust = GetRefData( pCustRef ) printf(1, "%-25s Balance=%9.2f Rate=%s\n", {lCust[1] & ' ' & lCust[2], lCust[3], lCust[4]}) end procedure sequence vCustList vCustList = {} vCustList &= addCustomer( {"Derek", "Parnell", 1000, 'A'} ) vCustList &= addCustomer( {"George", "Potter", 200, 'B'} ) vCustList &= addCustomer( {"Joyce", "Grimwade", 300, 'G'} ) vCustList &= addCustomer( {"Jim", "Ng", 321, 'G'} ) vCustList &= addCustomer( {"Diane", "Smith-Jones", 827, 'B'} ) vCustList &= addCustomer( {"Horace", "Thomas", 1211, 'A'} ) vCustList &= addCustomer( {"Betty", "Boo", 9820, 'A'} ) atom vTot for j = 1 to 3 do printf(1, "\n\nCycle %d\n", j) vTot = 0 for i = 1 to length(vCustList) do vTot += calcInterest( vCustList[i] ) end for printf(1, "Total interest: %9.2f\n\n", vTot) for i = 1 to length(vCustList) do displayCust( vCustList[i] ) end for -- Delete third customer FreeRef( vCustList[3] ) vCustList = vCustList[1..2] & vCustList[4..length(vCustList)] end for
------------------------ -- Derek Parnell Melbourne, Australia