9

これに関するいくつかの質問は、letccTheSeasonedSchemerで使用されています。

(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))))))
  1. 私は何letccが達成されるかを理解していると思います、そしてそれは基本的にルビー(そして一見CL)のようなものです、それは基本的catchthrow名前が何であるかを呼び出すことによってコードのブロック全体を短くすることができることを意味しますletcc。これは、この短いシリーズの本で出会った中で最も「機能的」でないもののように感じます。優れた機能的なスタイルを学びたいので、使用するのを少しためらうように感じます。私は誤解しているだけletccですか、それとも実際には関数型プログラミングの概念ではなく、パフォーマンスを向上させるためだけに存在しているのでしょうか?あるルーチンの途中で、突然コード内の別のポイントに到達する可能性があるという全体的な考えは、少し間違っているように感じます...プログラムフローのためにJavaでtry/catchを悪用するようなものです。

  2. letccOS Xにインストールしたバージョンのguile(1.8.7)には存在しないようです。guileで探す必要のある別の名前はありますか?

  3. letccJavaでのtry/catch、またはrubyでのcatch / throw(非ルビー主義者にとっては例外処理ではありません)と比較して誤解している場合、機能レベルでどのように正確に機能しますか?結局のところ、それが機能的であると私に納得させる、より長く、より複雑な方法で表現することができますか?

4

1 に答える 1

12
  1. 「機能的」にはいくつかの意味がありますが、一般的な意味が継続と矛盾することはありません。しかし、それら悪用して、読みにくいコードを作成する可能性があります。これらは「プログラムフローに悪用」される可能性のあるツールではなく、プログラムフローツールです。

  2. そこであなたを助けることはできません。Guileでの継続が半最近あったことは知っていますが、状況がどこにあるのかわかりません。それは間違いなくcall-with-current-continuation、通常はより親しみやすい名前であるはずでありcall/cclet/ccで構築できる単純なマクロですcall/cc

    Racketには、同じファミリ内のlet/ccの多数のビルトインと一緒にビルトインがあり、さらに、さまざまな制御演算子のライブラリ全体があります(参照の広範なリストがあります)。

  3. の単純な使用法はlet/cc、実際にはキャッチ/スローのようなものに似ています。より具体的には、そのような継続は一般に「エスケープ継続」(または「上向き」)として知られています。これは、そのコードで使用する種類の使用法であり、abortまたはを実装するためによく使用されreturnます。

    ただし、Schemeの継続は、どこでも使用できるものです。この違いを示す非常に簡単な例については、次のことを試してください。

    (define (foo f) (f 100))
    (let/cc k (+ (foo k) "junk") (more junk))
    
  4. 最後に、継続についてもっと読みたい場合は、PLAIの関連部分を見ることができます。また、Matthew Mightが書いたより簡単な例別の概要もあります。また、PLAIに基づいて私が書いたクラスノートをいくつか見ることができます。後者の投稿に触発されたいくつかの例で。

于 2012-06-19T16:49:31.270 に答える