部分継続でDelegateMapをGaucheで
- 部分継続でDelegateMap - ヒビルテ (2009-03-16)が素敵なので、Gaucheで書いてみる。
;; (reset/pc expr) == (reset expr) ;; (call/pc (lambda (k) expr ...)) == (shift k (begin expr ...)) (define (dmap2 l) (call/pc (lambda (k) (map k l)))) (reset/pc (+ 1 (dmap2 '(1 2 3)))) ==> (2 3 4) (reset/pc (+ 1 (dmap2 (dmap2 '((1 2) (2 3) (3 4)))))) ==> ((2 3) (3 4) (4 5))
できた。面白い。
となると、(dmap l0 l1 ...)を定義してみたくなる。これでいいの?
(define (dmap . l) (call/pc (lambda (k) (apply (map$ (lambda args (k args))) l)))) (reset/pc ((apply$ +) (dmap '(1 2 3) '(3 4 5)))) ==> (4 6 8) (reset/pc ((apply$ (pa$ + 1)) (dmap '(1 2 3) '(3 4 5)))) ==> (5 7 9)
____ ) 『 部分継続と部分適用ってなんか関係あるの?』っと。 /⌒ ⌒\ ) /( ●) (●) \ )/⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y丶 / ::::::⌒(__人__)⌒::::: \ | |r┬-| | \ `ー'´ / ノ \ /´ ヽ カ | l l||l 从人 l||l l||l 从人 l||l カ タ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. タ ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐ ,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄ ̄