2

通常はスキームで - syntax: (if test consequent alternate)

consequentたとえば、セクション内でいくつかの操作を実行しようとしています: true の場合、sum1 を 44 に設定し、1 を返します。
スキームコードでは -

(if #t ( 
          (set! sum1 44)
          (if #t 1)
          )) 

上記のコードは機能せず、プロンプトが表示されます -

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #<void>
  arguments...:
   1 
4

3 に答える 3

4

Scheme では、適用には常に括弧が使用されます。グループ化のために括弧を追加することはできません。

あなたのconsequentここは:

((set! sum1 44) (if #t 1))

外側の括弧のペアにより、Scheme は の結果を(set! sum1 44)手続きとして使用し、それを の結果に適用しようとします(if #t 1)

(私が思うに) あなたが望むのは、2 つの式を順番に評価し、最後の式の結果を返すことです。これを行うためのフォームはbeginであるため、次のようにする必要があります。

(begin (set! sum1 44) (if #t 1))
于 2012-12-17T10:42:24.567 に答える
3

一部のインタープリター (Racket など) はif、部分のないを記述すると文句を言いますelse。これに対処し、begin複数の式が結果部分にあるときにa を明示的に使用する必要を回避するには、when特別な形式を使用することをお勧めします (利用可能な場合、それは非標準であるため):

(when #t
  (set! sum1 44)
  (when #t 1))

一般に、これは awhenとその兄弟の構造ですunless:

(when <condition>    ; equivalent to (if <condition> (begin ...))
  <exp1>             ; consequent, no alternative
  <exp2>)

(unless <condition>  ; equivalent to (if (not <condition>) (begin ...))
  <exp1>             ; consequent, no alternative
  <exp2>)

結果と代替の両方に複数の式がある場合は、各部分ifで aを使用できます。begin

(if <condition>
    (begin     ; consequent
      <exp1>
      <exp2>)
    (begin     ; alternative
      <exp3>
      <exp4>))

...しかし、各句でconda を暗黙的に使用する a を使用する方がより実用的です。begin

(cond (<condition>
       <exp1>  ; consequent
       <exp2>)
      (else    ; alternative
       <exp3>
       <exp4>))
于 2012-12-17T14:16:28.163 に答える
3
(if #t (begin 
          (set! sum1 44)
          (if #t 1))) 
于 2012-12-17T10:42:31.060 に答える