エレファント・ビジュアライザー調査記録

ビジュアルプログラミングで数式の変形を表すことを考えていくブロクです。

関数プログラミングと無限論理多項式(30)

Go の例(5)

Go の例についても同様に修正します。

UnfoldL 関数を作成します。

func UnfoldL(f func(*Numbers) (int, *Numbers), init *Numbers) *IteratorSimpleImpl_int {
	src := init
	dst := 0
	next := func() bool {
		dst, src = f(src)
		return true
	}
	getCurrent := func() int {
		return dst
	}
	setCurrent := func(val int) {
	}
	return newIteratorSimpleImpl_int(next, getCurrent, setCurrent)
}

ゴルーチン版では UnfoldL 関数は以下のようにします。

func UnfoldL(f func(*Numbers) (int, *Numbers), init *Numbers) *IteratorChannelImpl_int {
	src := init
	dst := 0
	ch := make(chan int)
	serv := func(ch chan int) {
		for {
			dst, src = f(src)
			ch <- dst
		}
	}
	go serv(ch)
	return newIteratorChannelImpl_int(ch)
}

NextNumbers を以下の NextDigitAndNumbers で置き換えます。

func NextDigitAndNumbers(numbers *Numbers) (int, *Numbers) {
	numbers_copy := numbers.Copy()
	dd := numbers_copy.GetNextDecimalDigit()
	return dd, numbers_copy
}

Calc クラスの IterateServer メソッドは以下のように UnfoldL を使うように変更します。

func (xyz *Calc) IterateServer() string {
	number := newLongDecimal([]int{})
	square_difference := newLongDecimal([]int{3})
	init_numbers := newNumbers(number, square_difference, 0)
	dec := UnfoldL(NextDigitAndNumbers, init_numbers).Take(xyz.count)
	return newLongDecimal(dec).Print()
}