読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

PharoでFizzBuzzMachine

Pharo 学習記録

Smalltalk Advent Calendar 2014 - Qiita のnewappleshowさんの記事を見ながら作った。まだブラウザとか使いこなせてないから、どんなメソッドをどういう風に使えるのかわからなくてArray周りで苦戦した。あとブロックの中で最後に評価した式がブロックの値になることを忘れてて変に一時変数増えてげんなりしたけど、最終的になんとかなった。

いいカンジにクラスをテキストに書き出す方法がわからなかったので、File outしたものをそのまま貼り付ける。どうすればいいんだろう?ここでの表示にシンタックスハイライトとかも欲しいなあ。

'From Pharo3.0 of 18 March 2013 [Latest update: #30862] on 26 December 2014 at 3:52:41.341771 pm'!
Object subclass: #FizzBuzzMachine
    instanceVariableNames: 'fbs'
    classVariableNames: ''
    poolDictionaries: ''
    category: 'Phaendal-Learning'!

!FizzBuzzMachine methodsFor: 'accesing' stamp: 'Phaendal 12/26/2014 14:48'!
get
    ^ fbs.! !

!FizzBuzzMachine methodsFor: 'accesing' stamp: 'Phaendal 12/26/2014 14:49'!
cond: cond msg: msg
    fbs add: { cond . msg }.! !


!FizzBuzzMachine methodsFor: 'do' stamp: 'Phaendal 12/26/2014 15:52'!
do: list
    | str test |
    test := [ :x |
        str := ''.
        fbs do: [ :item | ((item first) value: x) ifTrue: [str := str, (item at: 2)]. ].
        (str == '') ifTrue: [x] ifFalse: [str]
    ].
    ^ list collect: [ :x | test value: x ].! !


!FizzBuzzMachine methodsFor: 'initialization' stamp: 'Phaendal 12/26/2014 14:44'!
initialize
    fbs := OrderedCollection new.! !

使ってみる。

fb := FizzBuzzMachine new.
fb cond: [ :x | x % 3 == 0 ]  msg: 'Fizz'.
fb cond: [ :x | x % 5 == 0 ]  msg: 'Buzz'.
fb cond: [ :x | x % 11 == 0 ] msg: 'Maze'.
result := fb do: ((1 to: 100) collect: [:x | x]).
Transcript show: result.

結果

an OrderedCollection(1 2 'Fizz' 4 'Buzz' 'Fizz' 7 8 'Fizz' 'Buzz' 'Maze' 'Fizz' 13 14 'FizzBuzz' 16 17 'Fizz' 19 'Buzz' 'Fizz' 'Maze' 23 'Fizz' 'Buzz' 26 'Fizz' 28 29 'FizzBuzz' 31 32 'FizzMaze' 34 'Buzz' 'Fizz' 37 38 'Fizz' 'Buzz' 41 'Fizz' 43 'Maze' 'FizzBuzz' 46 47 'Fizz' 49 'Buzz' 'Fizz' 52 53 'Fizz' 'BuzzMaze' 56 'Fizz' 58 59 'FizzBuzz' 61 62 'Fizz' 64 'Buzz' 'FizzMaze' 67 68 'Fizz' 'Buzz' 71 'Fizz' 73 74 'FizzBuzz' 76 'Maze' 'Fizz' 79 'Buzz' 'Fizz' 82 83 'Fizz' 'Buzz' 86 'Fizz' 'Maze' 89 'FizzBuzz' 91 92 'Fizz' 94 'Buzz' 'Fizz' 97 98 'FizzMaze' 'Buzz')

感想

  • Smalltalkでいいコードを書くのには、JavaScriptに比べても更に名前付けと整理の技術が必要そう。いいトレーニングになりそうだ。
  • 現状、Pharo Array method とかで検索してるのがせっかくの環境を活かせてない感あるので、うまい具合に環境を使うためのドキュメントが欲しい(ありそう)。
  • Pharo on Linux Mintで日本語使う方法どうにかして見つけたい。
  • FizzBazz生成器を作るのは楽しい。
  • 生成器を作るのは楽しい。
広告を非表示にする