4

andor、およびを表現するのは簡単notですif( のローカル バインディングの助けを借りてor)。逆が本当かどうか知りたいです。私の素朴な最初の試み:

(if test conseq altern) => (or (and test conseq) altern)

ただし、testが non-#fであり、conseqisである場合#f、翻訳は と評価されますがaltern、これは正しくありません。

の短絡の性質を維持しながら、正しい値に評価される変換はありifますか?

4

3 に答える 3

5

なぜがandifよりも少し多くのことを行っているのか、適切な説明があるように思えます。しかし、ごまかして a を追加して、実際の結果を遅らせることができれば:andorlambda

(define-syntax-rule (if c t e) ((or (and c (lambda () t)) (lambda () e))))
于 2011-02-04T16:27:52.417 に答える
2

(or (and test conseq) (and (not test) altern))一般的なパターンとしてみてください。test2 番目のを否定するandことにより、外側の論理和がが true の場合は∨ 、 false の場合はconseq∨のいずれかになります。#ftest#falterntest

于 2011-02-04T16:47:45.460 に答える
1

これは Eli Barzilay の答えと同じですが、ラムダでラップする代わりに、1 要素のリストでラップします。

(if test conseq altern) => (car (or (and test (list conseq)) (list altern)))

ところで、2.5 より前の Python にはまさにこの問題がありました。Python で条件式を (つまり、Scheme と同じtest ? conseq : alternように C で)書く良い方法はありませんでした。if最も単純な試みは

test and conseq or altern

これはほとんどの場合に機能しましたがconseq、Python で false と見なされた場合 (つまり、False、0、空のリスト、空の文字列など) に失敗しました。上記で発見した正確な問題です。修正は、それをリストにラップし (空でないリストは常に true)、再度抽出することでした:

(test and [conseq] or [altern])[0]

これは醜く見えます。conseq if test else alternこれが、Python 2.5で構文を追加した理由です。

于 2011-02-04T19:28:03.303 に答える