Re: Programming language difficulties.
- To: mathgroup at smc.vnet.net
- Subject: [mg38441] Re: Programming language difficulties.
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Mon, 16 Dec 2002 02:20:17 -0500 (EST)
- Organization: Universitaet Leipzig
- References: <atc9f8$3hs$1@smc.vnet.net>
- Reply-to: kuska at informatik.uni-leipzig.de
- Sender: owner-wri-mathgroup at wolfram.com
Hi, would you be so kind to read the manual *before* you start to programm ? Fine. Your first definition > withdraw := Evaluate[ > Module[ { balance = 100 }, > Function[ amount, > If[ balance >= amount, > balance -= amount; balance, > Print[ "Insufficient Funds" ] > ] > ] > ] > ] return a pure function that does the If[] test when you call it withdraw[60]. Since you force to evaluate the Module[] you create global variable balance$<a number> that can't removed when the Module[] ends. If you would like to use a fixed constant you should use With[], i.e. withdraw = With[{balance = 100}, Function[amount, If[balance >= amount, balance - amount, Print["Insufficient Funds"]]]] In the next definition > secondWithdraw[ initBalance_ ] := Evaluate[ > Module[ { balance = initBalance }, > Function[ amount, > If[ balance >= amount, > balance -= amount; balance, > Print[ "Insufficient Funds" ] > ] > ] > ] > ] you Evaluate[] the right side before you have a given a value for initBalance but that can't work, because the pattern initBalance_ has absolute nothing to do with the variable initBalance. You mean withdraw::insuff = "Insifficuent funds '1'." withdraw[amount_, balance_:100] := If[balance >= amount, balance - amount, Message[withdraw::insuff, balance] ] or withdraw1[amount_,balance_:100]/; balance>amount :=balance-amount withdraw1[amount_,balance_:100]:=(Message[withdraw::insuff, balance];balance) Regards Jens Oliver Ruebenkoenig wrote: > > Hi again Mathgroup ;-) > > This is a programming example from the wizard book chapter 3. > ( http://mitpress.mit.edu/sicp/full-text/book/book.html ) > > Consider the following: > > withdraw := Evaluate[ > Module[ { balance = 100 }, > Function[ amount, > If[ balance >= amount, > balance -= amount; balance, > Print[ "Insufficient Funds" ] > ] > ] > ] > ] > > In[2]:= withdraw [ 60 ] > > Out[2]= 40 > > In[2]:= withdraw[ 60 ] > Insufficient Funds > > The question now is, can I in Mathematica write a function that takes as > argument the balance, so that I do not have to use the fixed balance = > 100. Note that in first example balance is _not_ present in the global > context. > > My idea was the following: > > secondWithdraw[ initBalance_ ] := Evaluate[ > Module[ { balance = initBalance }, > Function[ amount, > If[ balance >= amount, > balance -= amount; balance, > Print[ "Insufficient Funds" ] > ] > ] > ] > ] > > In[7]:= W1:=secondWithdraw[ 100 ] > > In[8]:= W1[ 60 ] > Out[8]= If[initBalance >= 60, balance$2 -= 60; balance$2, > > Print[Insufficient Funds]] > > So this however does not work. I _assume_ that Evaluate hits to early. > The evaluation of balance >= amount to initBalance >= amount is too > early. Is this the problem? How can I circumvent it? > > I'd be glad for any insights you might have. > > Oliver Ruebenkoenig, <ruebenko at imtek.de> > Phone: ++49 +761 203 7293