2006-04-21から1日間の記事一覧

仮想的な無限列(3)

昨日の続きで、無限列を考えています。zipの意味を変えて少し整理しました。 class Sequence < Proc def self.create(*a, &block) self.new(&block).define(*a) end def define(*a) lambda { return a[0], self.call(self, *a) } end end class Proc def to_…

仮想的な無限列(4)

仮想的な無限列シリーズです。オブジェクト指向ベースではなく、関数ベースを試してみます。 SelfCall = lambda {|f, *a| lambda { f.call(f, *a) } } Show = lambda {|xs| SelfCall.call( lambda {|f, xs, n| if n == 0 puts "..." else y, ys = xs.call() …

仮想的な無限列(5)

仮想的な無限列(4)では、ShowとDropが似ていたので、無限列のはじめからn歩あるくWalkを作って統合しました。 Call = lambda {|f, *a| lambda { f.call(f, *a) } } Walk = lambda {|n, xs, eachf, lastf| Call.call( lambda {|fs, xs, n, eachf, lastf| if n…

仮想的な無限列(6)

リファレンスri Proc#callを見ていて、f.call(1, 2, 3)の代わりにf[1, 2, 3]が使えることを知りました。すばらしい。 Call = lambda {|f, *a| lambda { f[f, *a] } } Walk = lambda {|n, xs, eachf, lastf| Call[ lambda {|fs, xs, n, eachf, lastf| if n > …

仮想的な無限列(7)

Zipを作りました。それからarityや型的なものをちょっぴり名前に反映。OfNarutalとか。 Call = lambda {|f, *a| lambda { f[f, *a] } } Walk = lambda {|n, xs, eachf, lastf| Call[ lambda {|fs, xs, n, eachf, lastf| if n > 0 y, ys = xs[] eachf[y, ys] …

仮想的な無限列(8)

有限列も使えるようにしました。OfGivenを使います。 Call = lambda {|f, *a| lambda { f[f, *a] } } Walk = lambda {|n, xs, eachf, lastf| Call[ lambda {|fs, xs, n, eachf, lastf| if n > 0 y, ys = xs[] eachf[y, ys] fs[fs, ys, n - 1, eachf, lastf] …