継続マラソン5

昨日書いた以下のコードですが

(define (message-join l)
   (call/cc
    (lambda (end)
      (letrec ((message-join-iter (lambda (ll messages)
                                    (if (null? ll)
                                        (end messages)
                                        (message-join-iter (cdr ll) (string-join (list messages (car ll))))))))
      (message-join-iter l "")))))

(display (message-join (list "muda" "na" "join" "dane\n")))


zickさんから、ありがたいツッコミを頂きました。

# zick 『message-join-iterはtail recursiveだから、
脱出してもあまり嬉しくない気がするんですが……。
むしろ全体としてはコストが増えてません?』


なるほど。僕の解釈は以下の通りなんですが合っていますでしょうか。
message-join-iter は末尾最適化されて無限ループ + goto みたいな感じで深くスタックフレームを使っていかないのでこの継続による大域脱出はあまり意味がない(かも)