[erlang-questions] feedback please

Roelof Wobben <>
Fri Sep 25 08:54:38 CEST 2015


Op 25-9-2015 om 08:22 schreef Roelof Wobben:
> Op 25-9-2015 om 02:58 schreef Richard A. O'Keefe:
>> On 24/09/2015, at 5:56 pm, zxq9 <> wrote:
>>
>>> On Thursday 24 September 2015 07:41:40 Roelof Wobben wrote:
>>>> Thanks,
>>>>
>>>> You are right. I did take a quick look and almost the whole chapter is
>>>> try .. catch.  So match or chrash is better ?
>>> It is not so much of a matter of which is "better" -- but that 
>>> *most* of the time you want to follow the mantra of "let it crash" 
>>> and this is a very natural fit for Erlang.
>> It must be said that *this* specific example is one where
>> crashing is an extremely bad thing.  If you went to your
>> ATM and a process in the bank's machines had crashed and
>> completely lost track of your money, you would be EXTREMELY
>> unhappy.  Lawyer-level unhappy.
>>
>> A lot of values can be thrown away and no harm done.
>> But if a process is supposed to be managing persistent
>> state there may be serious legal penalties attached to
>> losing it.
>>
>> This would make a nice little DETS example:  does it
>> really make sense to keep the balance in a persistent
>> store?  Too right it does!
>>
>> _______________________________________________
>> erlang-questions mailing list
>> 
>> http://erlang.org/mailman/listinfo/erlang-questions
>>
>>
>> -----
>> Geen virus gevonden in dit bericht.
>> Gecontroleerd door AVG - www.avg.com
>> Versie: 2015.0.6140 / Virusdatabase: 4419/10692 - datum van uitgifte: 
>> 09/24/15
>>
>
> Hello,
>
> Here is my version with a quit choice and a check if the beginning 
> balance is zero or more :
>
> -module(balance).
> -export([maintain_balance/1]).
>
> maintain_balance(Balance) when Balance >= 0  ->
>     io:format("~n~n"),
>     io:format("Your account balance is $~w.~n",  [Balance]),
>     Action = ask_action(),
>     case Action  of
>        quit ->
>             io:format("Thanks for using our software");
>         _    ->
>             Amount = ask_amount(),
>             case Action of
>                 withdraw -> withdraw(Balance, {Action, Amount});
>                 deposit -> deposit(Balance, {Action, Amount})
>             end
>    end;
>
> maintain_balance(_) ->
>     io:format("The balance cannot be negative").
>
> withdraw(0, {withdraw, _}) ->
>     ok = io:format("Hey! You're broke!~n"),
>     maintain_balance(0);
>
> withdraw(Balance, {withdraw, Amount}) when Amount > Balance ->
>     ok = io:format("You cannot withdraw more than you have~n"),
>     maintain_balance(Balance);
>
> withdraw(Balance, {withdraw, Amount}) ->
>     maintain_balance(Balance - Amount).
>
> deposit(Balance, {deposit, Amount}) ->
>     maintain_balance(Balance + Amount).
>
> ask_action() ->
>     Input = io:get_line("Which action do you need? 
> (W)ithdraw/(D)eposit?/(Q)uit "),
>     case Input of
>         [$w | _] -> withdraw;
>         [$W | _] -> withdraw;
>         [$d | _] -> deposit;
>         [$D | _] -> deposit;
>         [$q | _] -> quit;
>         [$Q | _] -> quit;
>         BadInput ->
>             ok = io:format("You can't seem to '~tp' today...~n"
>                            "Let's try that again...~n",
>                            [BadInput]),
>             ask_action()
>     end.
>
> ask_amount() ->
>     Input = io:get_line("How much? "),
>     case scrub_amount(Input) of
>         {ok, Number} when Number > 0 ->
>             Number;
>         {ok, 0} ->
>             ok = io:format("$0? Giving up on the idea already?~n"),
>             0;
>         {ok, Number} ->
>             ok = io:format("Hey, you! ~tp is less than no money!~n",
>                            [Number]),
>             ask_amount();
>         {error, bad_input} ->
>             ok = io:format("Hrm... '~tp' does not seem to be a number~n"
>                            "Now, one more time...~n",
>                            [Input]),
>             ask_amount()
>     end.
>
> scrub_amount(Input) ->
>     case string:to_integer(Input) of
>         {error, no_integer} -> {error, bad_input};
>         {Int, _}            -> {ok, Int}
>     end.
>
>
> Roelof
>
>

And here one without the nested case

-module(balance).
-export([maintain_balance/1]).

maintain_balance(Balance) when Balance >= 0  ->
     io:format("~n~n"),
     io:format("Your account balance is $~w.~n",  [Balance]),
     Action = ask_action(),
     if
         Action =:= quit ->
             io:format("Thanks for using our software");
         Action =:= withdraw ->
             withdraw(Balance, {Action, ask_amount()});
         Action =:= deposit ->
             deposit(Balance, {Action, ask_amount()})
     end;

maintain_balance(_) ->
     io:format("The balance cannot be negative").

withdraw(0, {withdraw, _}) ->
     ok = io:format("Hey! You're broke!~n"),
     maintain_balance(0);

withdraw(Balance, {withdraw, Amount}) when Amount > Balance ->
     ok = io:format("You cannot withdraw more than you have~n"),
     maintain_balance(Balance);

withdraw(Balance, {withdraw, Amount}) ->
     maintain_balance(Balance - Amount).

deposit(Balance, {deposit, Amount}) ->
     maintain_balance(Balance + Amount).

ask_action() ->
     Input = io:get_line("Which action do you need? 
(W)ithdraw/(D)eposit?/(Q)uit "),
     case Input of
         [$w | _] -> withdraw;
         [$W | _] -> withdraw;
         [$d | _] -> deposit;
         [$D | _] -> deposit;
         [$q | _] -> quit;
         [$Q | _] -> quit;
         BadInput ->
             ok = io:format("You can't seem to '~tp' today...~n"
                            "Let's try that again...~n",
                            [BadInput]),
             ask_action()
     end.

ask_amount() ->
     Input = io:get_line("How much? "),
     case scrub_amount(Input) of
         {ok, Number} when Number > 0 ->
             Number;
         {ok, 0} ->
             ok = io:format("$0? Giving up on the idea already?~n"),
             0;
         {ok, Number} ->
             ok = io:format("Hey, you! ~tp is less than no money!~n",
                            [Number]),
             ask_amount();
         {error, bad_input} ->
             ok = io:format("Hrm... '~tp' does not seem to be a number~n"
                            "Now, one more time...~n",
                            [Input]),
             ask_amount()
     end.

scrub_amount(Input) ->
     case string:to_integer(Input) of
         {error, no_integer} -> {error, bad_input};
         {Int, _}            -> {ok, Int}
     end.

Roelof



More information about the erlang-questions mailing list