これに関するいくつかの質問は、letcc
TheSeasonedSchemerで使用されています。
(define (intersect-all sets)
(letcc hop
(letrec
((A (lambda (sets)
(cond
((null? (car sets)) (hop '())
((null? (cdr sets)) (car sets))
(else
(intersect (car sets)
(A (cdr sets)))))))
; definition of intersect removed for brevity
(cond
((null? sets) '())
(else (A sets))))))
私は何
letcc
が達成されるかを理解していると思います、そしてそれは基本的にルビー(そして一見CL)のようなものです、それは基本的catch
にthrow
名前が何であるかを呼び出すことによってコードのブロック全体を短くすることができることを意味しますletcc
。これは、この短いシリーズの本で出会った中で最も「機能的」でないもののように感じます。優れた機能的なスタイルを学びたいので、使用するのを少しためらうように感じます。私は誤解しているだけletcc
ですか、それとも実際には関数型プログラミングの概念ではなく、パフォーマンスを向上させるためだけに存在しているのでしょうか?あるルーチンの途中で、突然コード内の別のポイントに到達する可能性があるという全体的な考えは、少し間違っているように感じます...プログラムフローのためにJavaでtry/catchを悪用するようなものです。letcc
OS Xにインストールしたバージョンのguile(1.8.7)には存在しないようです。guileで探す必要のある別の名前はありますか?letcc
Javaでのtry/catch、またはrubyでのcatch / throw(非ルビー主義者にとっては例外処理ではありません)と比較して誤解している場合、機能レベルでどのように正確に機能しますか?結局のところ、それが機能的であると私に納得させる、より長く、より複雑な方法で表現することができますか?