vieweditattachhistoryswikistopchangessearchhelp

Soopy で BankAccount

はじめまして。
勝手にページ作ってもよろしいでしょうか?
オブジェクト指向言語としてはBankAccountは避けて通れないのかと
最近思い始めたもので、ちょっと書いてみました。
問題は、最新のCVS版(0.4.1としていずれリリース予定)でしか動かないので、
ソースからコンパイルしてもらわなければいけないというのが、ちょっと。。。 -- randy

Soopy で BankAccount

/*
 * Bank Account
 */

BankAccount = {
  balance: 200;

  fun deposit(x:int){
    do: balance = balance + x;
  };

  fun withdraw(x:int){
    do: balance = balance - x;
    ensure: balance >= 0;
    rescue: [
      balance = x;  # 引けば0になるように(考えすぎ?)
      retry;
    ];
  };
};

println "<<BankAccout demo>>";
print "BankAccount balance: "; println(BankAccount balance);  # => 200

BankAccount deposit(50);
println "deposit(50)";
print "BankAccount balance: "; println(BankAccount balance);  # => 250

BankAccount withdraw(100);
println "withdraw(100)";
print "BankAccount balance: "; println(BankAccount balance);  # => 150

BankAccount withdraw(200);
println "withdraw(200)";
print "BankAccount balance: ";  println(BankAccount balance);  # => 0

/*
 * myAccount
 */

myAccount = BankAccount + {};
println "" "<<MyAccount demo>>";
myAccount balance = 100;
print "myAccount balance: ";  println(myAccount balance);  # => 100
myAccount deposit(50);
println "deposit(50)";
print "myAccount balance: ";  println(myAccount balance);  # => 150
print "BankAccount balance: ";  println(BankAccount balance);  # => 0

/*
 * StockAccount
 */

StockAccount = BankAccount +
  {
    private
      fun setBalance(x:int){
        do: numShares = x / pricePerShare;
      };

      fun getBalance(){
        do: numShares * pricePerShare;
      };

    public
      numShares:     10;
      pricePerShare: 30;
      property balance {set: setBalance; get: getBalance;};
  };

println "" "<<StockAccount demo>>";
print "StockAccount numShares: "; println(StockAccount numShares);          # => 10
print "StockAccount pricePerShare: "; println(StockAccount pricePerShare);  # => 30
print "StockAccount balance: ";  println(StockAccount balance);    # => 300
StockAccount balance = 600;
print "StockAccount balance: ";  println(StockAccount balance);    # => 600
print "StockAccount numShares: "; println(StockAccount numShares); # => 20
StockAccount deposit(60);
println "deposit(60)";
print "StockAccount balance: ";  println(StockAccount balance);    # => 660
print "StockAccount numShares: "; println(StockAccount numShares); # => 22
StockAccount withdraw(90);
println "withdraw(90)";
print "StockAccount balance: ";  println(StockAccount balance);    # => 570
print "StockAccount numShares: "; println(StockAccount numShares); # => 19




コメントなど

御大将自らのご出陣、痛み入ります。StockAccount の property 文が活きていますね。--sumim

ようやくSoopy0.4.1を公開しました。
これで上で書いたBankAccountを試してもらうことが出来ます。

で、上でかいたwithdrawは、事後条件(ensure)の
使い方が本来の使い方とかけ離れているので、
こっちのほうがいいと思うので、修正Versionを。 --randy

  fun withdraw(x:int){
    do: [
      balance = balance - x;
      if(balance < 0){
        true: balance = 0;
      };
    ];
  };


このページを編集 (3219 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 2802 times.