7 を出力。3 がレシーバ、+(4)がメッセージ。この場合、パラメータを括る ( ) は省略できる。3 + 4
Smalltalk (7 * 5 で 35 を出力)と異なり、一般的な 23 を出力。ただし一方で (3 + 4) * 5 がエラーになるなど問題も。どうやら、レシーバを括弧でくくってはいけないらしい。パーサーを見ていないので分かりませんが(見ても C は分かりませんが(^_^;))おそらく ( ) で括ると引数扱いになってしまうのかな、と。3 + 4 * 5
"Hello, World!" を出力。"Hello, World!" がレシーバ、print がメッセージ…だと思ったら、"Hello, World!" もメッセージ(everything is a message)、という可能性もありそう。要調査。"Hello, World!" print
なぜか常に 0 を返すデフォルトの Number >> factorial をオーバーライドしてみる。3628800 を出力。self * (self - 1) factorial とできないのツライところ。bignum はサポートしていないらしいが、ある程度までは答えを出してくる。Number factorial = method(if(self < 2, 1, n = self - 1; self * n factorial)) 10 factorial
HMDT の Chain of Responsibility の NewtonScript 版を Io で焼き直したもの。Object clone の記述の繰り返しが若干ウザイ(未定義の変数はデフォルトで Object のクローンにするとかで回避できないか)が、それを含めて素直に見たまま何をしたいのかが分かってよろしげ。「help in Button」「print out in Window」「preview in Application」を順に出力。Application = Object clone; Application preview = method("preview in Application\n" print); Window = Object clone; Window printOut = method("print out in Window\n" print); Button = Object clone; Button help = method("help in Button\n" print); application = Application clone; window = Window clone; window parent = application; button = Button clone; button parent = window; button help; button printOut; button preview;
Self の Demo.snap にある BankAccount のデモを Io 向けに焼き直し。BankAccount = Object clone BankAccount dollars = 200 BankAccount dollars ==> 200 BankAccount deposit = method(x, dollars = dollars + x) BankAccount deposit(50) ==> 250 BankAccount withdraw = method(x, dollars = 0 max(dollars - x)) BankAccount withdraw(100) ==> 150 BankAccount withdraw(200) ==> 0 account = BankAccount clone account dollar ==> 0 account print Object_0x1c71e0 ( proto = Object_0x147b00 # まだ proto の dollars を参照している ) account deposit(500) ==> 500 account print Object_0x1c71e0 ( dollars = 500 # 自らの dollars を新設してそこに数値を設定 proto = Object_0x147b00 ) BankAccount dollars ==> 0 # proto の dollars には影響なし StockAccount = BankAccount clone StockAccount numShares = 10 StockAccount pricePerShare = 30 StockAccount dollars = method(x, if(x, numShares = x / pricePerShare; dollars, numShares * pricePerShare)) StockAccount dollars # 引数がなければ株数、株単価から計算 ==> 300 StockAccount dollars(150) # 引数があれば、株単価から株数を算出し設定 StockAccount numShares ==> 5 # 株数値が変更されている stock = StockAccount clone stock dollars(600) stock numShares ==> 20
のようになり、話の流れを完結できる。参考までに、Self の GUI を使わない CUI 版はこんな感じ。Self の GUI 版は ここいらへん [英語]。Smalltalk の例はこちら。ここまで--sumimBankAccount = Object clone BankAccount dollars = 200 BankAccount dollars ==> 200 BankAccount getDollars = method(dollars) BankAccount setDollars = method(x, dollars = x) BankAccount deposit = method(x, setDollars(getDollars + x)) BankAccount deposit(50) ==> 250 BankAccount withdraw = method(x, setDollars(0 max(getDollars - x))) BankAccount withdraw(100) ==> 150 BankAccount withdraw(200) ==> 0 account = BankAccount clone account getDollars ==> 0 account print Object_0x25ac80 ( proto = Object_0x23e3e0 # まだ BankAccount の dollars を参照している ) account deposit(500) ==> 500 account print Object_0x25ac80 ( dollars = 500 # 自らの dollars を新設してそこに数値を設定 proto = Object_0x23e3e0 ) BankAccount getDollars ==> 0 # proto の dollars には影響なし StockAccount = BankAccount clone StockAccount numShares = 10 StockAccount getNumShares = method(numShares) StockAccount setNumShares = method(x, numShares = x) StockAccount pricePerShare = 30 StockAccount getPricePerShare = method(pricePerShare) StockAccount setPricePerShare = method(x, pricePerShare = x) StockAccount getDollars = method(getNumShares * getPricePerShare) StockAccount setDollars = method(x, setNumShares(x / getPricePerShare); getDollars) StockAccount getDollars # ゲッターを使用 ==> 300 StockAccount setDollars(150) # セッターを使用 StockAccount getNumShares ==> 5 # 株数値が変更されている stock = StockAccount clone stock setDollars(600) stock getNumShares ==> 20 stock deposit(60) # “=”をセッターに使うと StockAccount >> dollars(getDollars 相当)が破壊されてしまっていた ==> 660 stock getNumShares ==> 22 stock withdraw(120) ==> 540 stock getNumShares ==> 18
このページを編集 (10379 bytes)
以下の 8 ページから参照されています。 |
This page has been visited 11928 times.