1

SICP コースでは、Scheme を学習しており、点が軸に沿った長方形内にあるかどうかを確認するという課題がありました。私はこのようにしました:

(define in-rect?
  (lambda (px py rx1 ry1 rx2 ry2) 
    (<= (* (- px rx1) (- px rx2)) 0) and
    (<= (* (- py ry1) (- py ry2)) 0))) 

私は以前の C の習慣に従ってこれを行い、ポーランド語の表記法をしばらく忘れていました。私たちのオンライン家庭教師プログラムが使用するインタープリターは、私が意図したとおり、このコードを「正しく」実行します。ただし、知る限り、この「and」の使用法は構文的に間違っているはずです。これを実行しようとすると、DrRacket が構文エラーを指摘します。

では、これはどのようにしてオンライン チューターのすべてのテスト ケースの正しい値を評価したのでしょうか? このオプションも有効ですか?

4

2 に答える 2

0
(<= (* (- px rx1) (- px rx2)) 0) 
and
(<= (* (- py ry1) (- py ry2)) 0)

実際には 3 つの異なる (潜在的な) 値/式です。begin でラップしなかったため、実装に応じて、インタープリターはラムダの値として左端または右端を返す場合があります。

あなたのオンライン インタープリターは、おそらくandマクロや構文ではなくプリミティブ関数として実装されているか、単にマクロや構文キーワードを式として使用しないことに固執していません。

インタープリターandが何らかの値を持っている (および/または有効な式である) と判断した場合、ラムダ本体の 3 番目の式の最初の値を返すことができます。

于 2013-10-06T15:49:53.040 に答える
0

の構文andは、ほとんどの式と同じです。プレフィックス表記を使用します。また、必ずしもブール式である必要はありませんが、0 個以上の引数を持つことができます。

(and <exp1> <exp2> <exp3> ...)

コードの場合、次のようになります。

(define in-rect?
  (lambda (px py rx1 ry1 rx2 ry2) 
    (and (<= (* (- px rx1) (- px rx2)) 0)
         (<= (* (- py ry1) (- py ry2)) 0))))

あなたのコードがオンラインチューターで機能しているように見えた理由については、インタープリターが 3 つの式 (最初の式、特別な形式、2 番目の式)lambdaを含む暗黙的な内部の本体を評価し、最後の条件の値だけを返した可能性があります。引数なしでは一般に「不正な構文」または同様のエラーが発生するため、まったく機能したのは奇妙ですが、実装方法によって異なりますが、標準に準拠したインタープリターのようには見えません。begin<=and<=and

すべてが明確であることを確認するには、ドキュメンテーションandを参照してください。これは、C のバックグラウンドから来て、予想とは少し異なる動作をするためです。and最初の false 条件で短絡することを思い出してください。

(and (+ 1 1) #f (/ 1 0)) ; will work without a division by zero error
             ^
   evaluation stops here
=> #f

また、 は最後に遭遇した式の値を返すことに注意してandください。これは、Scheme では明示的に ではないものはすべて#ftrue と見なされるためです。

(and #t (* 2 3) (+ 1 1))
                   ^
         evaluation stops here
=> 2
于 2013-10-06T15:45:19.557 に答える