4

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

答えて

7

あなたは、いくつか何かをテストして真実か偽かを判断する方法がありません。あなたはブーリアンの機能的な表現で近づくことができます。例えば、一般的な教会のエンコーディングを持つ:

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

、今あなたが「成功」の継続と「失敗」1を受け入れる関数として(これらのエンコードされたブール値の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は本当に関連何もしていません...

+0

私はあなたができるとは思わなかった。ブール値を関数として定義すると、ブール演算子を再定義する必要があるような方法で言語のセマンティクスが変更されます。これは、Schemeではすべての関数がブール値とみなされるとfalseでないためです。 – N4tur41Myst1c

+0

はい、そのような変更は異なる言語になります...それが私が「あなたができない」から始まった理由です。 –

2

高位手順のみを使用しての場合を実装できます。これは、教会のコード化されていない明らかな教会です:

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

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

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

関連する問題