Re: [DOS] Can we emulate "pass by reference" in Eu?

new topic     » goto parent     » topic index » view thread      » older message » newer message

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

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu