部分継続でDelegateMapを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
    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄ ̄