2009-03-16 [長年日記]
λ. 部分継続でDelegateMap
ku-ma-meさんの map が面倒なので DelegateMap を読んで、なんか部分継続(delimited continuation, 限定継続)っぽいなと思ったので、shift/resetで書いてみた。 (shift/reset自体の実装については、call/ccによるshift/resetの表現 - ヒビルテ(2003-05-03) や まめめも(2008-04-17) を参照のこと)
module Enumerable def dmap2 # Object.__fcall__(:shift) {|k| map {|e| k[e] } } Object.__send__(:shift) {|k| map {|e| k[e] } } end end p reset { 1 + [1, 2, 3].dmap2 } #=> [2,3,4] p reset { 1 + [[1,2], [2,3], [3,4]].dmap2.dmap2 } #=> [[2, 3], [3, 4], [4, 5]]
まあ、自然言語の「任意の」とかの量化子はまさにこんな感じなので、当たり前といえば当たり前な感じだけど。 参考: “Continuations in Natural Language” by Chris Barker - ヒビルテ (2008-03-13)