16

私のSchemeプログラムには、「if」の真の条件で複数のステートメントを実行するという非常に単純な要件がありました。。だから私は自分のコードを次のように書きます:

(if (= 1 1)
 ((expression1) (expression2))  ; these 2 expressions are to be
                                ; executed when the condition is true
  (expression3))

明らかに、私は意図せずに#引数を使用して#プロシージャを作成したため、上記は機能しません。したがって、作業を完了するには、上記の式を新しい関数に入れて、expression1、expression2の代わりにそこから呼び出すだけです。できます。

したがって、ここでの私のポイントは、ここでの私の要件をサポートする可能性のある他の条件付き構造はありますか?

4

5 に答える 5

23

MIT-Schemeでは、それほど違いはありませんが、次を使用できますbegin

(if (= 1 1)
    (begin expression1 expression2)
    expression3)

またはCondを使用します:

(cond ((= 1 1) expression1 expression2)
      (else expression3))
于 2009-07-17T15:48:43.897 に答える
2

(begin ...)複数の式を評価し、最後の式を返す方法です。他の多くの構成は、「暗黙の」beginブロックとして機能します(ブロックのように複数の式を許可しbeginますが、言う必要はありませんbegin)。たとえば、cond句の本体、definefor関数の本体、alambdaの本体、の本体aletなど; 気づかずに使っていたのかもしれません。ただし、のif場合、2つの式(1つはtrue、もう1つはfalse)が隣り合っているため、構文ではそれは不可能です。したがって、複数の式を許可すると、あいまいになります。したがって、明示的なbegin構成を使用する必要があります。

于 2009-07-17T18:22:34.897 に答える
1

CONDを使用するか、LispのPROGNのようなものに式を入れることができます(PLT Schemeでどのように呼び出されるかはわかりません。編集:BEGINと呼ばれます)。

CONDはSchemeでは次のようになります。

(cond [(= 1 1)
       (expression1)
       (expression2)]
      [else
       (expression3)])
于 2009-07-17T15:48:04.337 に答える
1

(begin ...)を使用して、ifステートメントのtrueブランチで必要なものを取得できます。こちらをご覧ください

于 2009-07-17T15:51:36.793 に答える
0

if3つ以上のケースでステートメントを使用するには、ネストが必要です。例:

(if (test-1)               ; "if"
    (expression-1)
    (if (test-2)           ; "else-if"
        (expression-2)
        (expression-3)))  ; "else"

condネストされたsの束よりも読みやすく、句ifを使用せずに複数のステートメントを実行できるため、条件ステートメントを表現するには、を使用するのが好ましい方法のようです。begin

(cond ((test-1)
       (expression-1))
      ((test-2) 
       (expression-2)
       (expression-3))
      (else 
       (default-expression)))
于 2012-09-16T12:06:18.040 に答える