5

「call/cc」を使用して任意の制御フロー構造を実装できると聞いたので、「call/cc」を使用してそのようなすべての構造を実装しようとしていますが、問題が発生しています。「if」がないと仮定すると、「define-syntax」と「call/cc」を使用してどのように実装しますか? それは可能ですか、それとも私は誤解されていますか? 「call/cc」を使用して無条件ジャンプを実装する方法は知っていますが、マシンレベルでは、実行がプロセッサのステータスビットに依存する分岐命令で条件付き実行が実行されます。このタイプの構造がなければ、それがどのように行われるかわかりません。

4

2 に答える 2

8

できません --物事をテストし、それらが真か偽かを判断する何らかの方法が必要です。ただし、ブール値の関数表現を使用すると、近づくことができます。たとえば、一般的な教会のエンコーディングでは次のようになります。

(define (true x y) x)
(define (false x y) y)

これで、(これらのエンコードされたブール値の 1 つを返す) テストを、「成功」の継続と「失敗」の継続を受け入れ、それを使用して継続する関数と見なすことができます。

(define (if c x y) (c x y))

これを試してみたい場合は、Scheme が怠惰な言語ではないという事実を考慮する必要があるため、うまくいく必要があります。例えば:

(define (true x y) (x))
(define (false x y) (y))
(define-syntax if
  [(if c x y) (c (lambda () x) (lambda () y))])

(ただし、これらのブール値を返すには、既存の述語などを修正する必要があります。)

いずれにせよcall/cc、それ自体は実際に関連することは何もしていません...

于 2011-07-29T03:40:50.570 に答える
2

上位手続きのみで実装できます。これは明らかなカリー化されていない教会のエンコーディングです:

IF ? T E === (? (lambda () T) (lambda () F))

TRUE     === (lambda (t _) (t))
FALSE    === (lambda (_ f) (f))

継続は全く必要ありません。True は、最初の引数を実行するバイナリ関数です。False は、2 番目の引数を実行するバイナリ関数です。If は、テスト (?) によって決定された True/False を取得し、結果を遅らせる 2 つの関数を与えることによって、それらをシーケンス処理する 3 項関数です。

于 2012-11-17T18:38:49.157 に答える