フィボナッチ数列を1行(行末ピリオドなし)で書いてみる。
[:a :b |
10 timesRepeat:
[Transcript show: (b value: (a value: a value + b value) value - b value) value printString,' ']]
value: (ValueHolder with: 1)
value: (ValueHolder with: 0)
valueがやたら多いのは、引数で与えたaやbにブロック内で:=しようとしてもエラーになるのを回避するため。
ValueHolderにすれば中身の状態をアクセッサで変えられる。
ValueHolderは画面のInputFieldで使われるが、基本的に何でも入るからこういうときにも使える。
同じようなやり方でパスカルの三角形も出力可能。
[:a |
10 timesRepeat:
[Transcript
show: ((a value: #(0), (a value keysAndValuesDo: [:k :v | a value at: k put: v + (a value , #(0) at: k + 1)]))
value allButFirst: 1) printString]]
value: (ValueHolder with: #(0 1 1) asList)
フィボナッチを再帰の1行コードで書いた場合はこんな感じ。
Transcript show:
((blo:=[:a :b :c | c=0 ifTrue: [a printString] ifFalse: [blo value: a, (Array with: b) value: a last + b value: c - 1]])
value:#(1) value: 1 value: 10)
パスカルの三角形を再帰の1行コードで書いた場合はこんな感じ。
((ScheduledWindow new) component:
(BorderDecorator on:
((blo := [:a :b :c |
b = 1
ifTrue: [(c inject: '' into: [:str :v | str,'\',(v printString copyFrom:3 to: v printString size -1)]) withCRs asComposedText centered]
ifFalse: [blo value: (#(0), (a keysAndValuesDo: [:k :v | a at: k put: v + (a, #(0) at: k + 1)])) value: b - 1 value: (c copyWith: a)]])
value: #(0 1 1) beMutable value: 10 value: #(#(1 1))))) open
このやり方はユークリッド互除法もいける。0割エラーを捉えれば出力も簡単。
ただし n1 > n2 かつ n <> 0 の自然数で引数を与える必要あり。
(blo := [:a :b | [blo value: b value: a \\ b] on: Exception do: [Transcript show: a printString]]) value: n1 value: n2
最終更新:2014年03月19日 15:25