0

私は2つのブール値を比較しようとしています:

(if (equal? #f (string->number "123b"))
      "not a number"
      "indeed a number")  

DrRacketのコマンドラインでこれを実行すると、取得"not a number"しますが、そのコードをより大きなコードに入れると、関数はその文字列("not a number")を返しません。コードは次のとおりです。

(define (testing x y z)

    (define badInput "ERROR")  

    (if (equal? #f (string->number "123b"))
          "not a number"
          "indeed a number")  

    (display x))

そしてコマンドラインから:(testing "123" 1 2) 表示:123

なんで ?

さらに、選択するたびに、どのように値を返すことができますか?

ありがとう

4

4 に答える 4

4

これを試して:

(define (testing x)
  (if (equal? #f (string->number "123b"))
      (display "not a number")
      (display "indeed a number"))
  (display x))

式の結果を破棄していましたif。条件は正常に機能していましたが、結果の文字列には何も行われず、無視されました。は、独自の値を持たない副作用のある操作である#<void>ため、プロシージャ全体が返されます。また、変数とパラメータはまったく使用されていなかったため、display削除しました。badInputyz

プロシージャから値を返すには、返す値を含む式をプロシージャの本体の最後に配置するだけです。これにより、コードが機能しなかった理由が説明されます。最後の式のみが値を返しますが、サイドで行うこともできます。 -display最後の式を含む前の任意の式を使用して操作を実行する(たとえば、を呼び出す)。

実際のところ、値を返すことでコードをより慣用的に書くことができます。現在の条件は、渡されるパラメーターにif実際に依存していることに注意してください。x

(define (testing x)
  (if (not (string->number x))
      (string-append "not a number " x)
      (string-append "indeed a number " x)))

(displayln (testing "123"))
=> indeed a number 123

(displayln (testing "123b"))
=> not a number 123b

編集:

あなたの質問の最後の編集に関して、私はあなたがこのようなものを探していると信じています:

(define (convert originalNumber s_oldBase s_newBase)
  (if (or (not (string->number originalNumber)) ; validate error conditions first
          (not (string->number s_oldBase))
          (not (string->number s_newBase)))
      "ERROR"     ; if one of the input values is wrong, return an error message
      (begin      ; else
        <body>))) ; put the rest of the procedure's body in here

またはこれ、あなたが使用したい場合cond

(define (convert originalNumber s_oldBase s_newBase)
  (cond ((or (not (string->number originalNumber)) ; validate error conditions
             (not (string->number s_oldBase))
             (not (string->number s_newBase)))
         "ERROR")  ; if one of the input values is wrong, return an error message
        (else      ; else
         <body>))) ; put the rest of the procedure's body in here
于 2012-12-15T16:35:18.427 に答える
2

この理由は、条件がfalseと評価されていても、その結果を破棄するだけだからです。

入力した内容は次のとおりです。

(define (testing x y z)

    (define badInput "ERROR")  

    "not a number"

    (display x))

"not a number"ただ捨てられるところ。

返品するには、次のようなものを試してください

(define (testing x y z)

    (define badInput "ERROR")  
    (cond

        ((equal? #f (string->number "123b"))
              "not a number")  

        (else (display x))))
于 2012-12-15T16:29:26.290 に答える
1

関数の値は、その本体の最後の式の値です。testing関数の本体の最後の式は(display x)であるため、これが関数の値です。あなたifは体の最後の表現ではなく、副作用もないので、基本的には何もしません。

ifへの呼び出し後に移動するとdisplaytestingが表示されx、「番号ではありません」が返されます。

于 2012-12-15T16:28:30.907 に答える
1

call/ccこれはここではやり過ぎになりますが、 (またはcall-with-current-continuation)によって設定された継続を呼び出すことにより、どこからでも直接値を返すことができます。

(define (primo args ...)
   (call/cc (lambda (k) (secundo k args ...))))

(define (secundo k args ... )
  ... do your stuff and whenever you feel like it,
  ... return a value by calling
  (k value)
  ....
  .... )
于 2012-12-15T18:00:29.283 に答える