これを試して:
(define (testing x)
(if (equal? #f (string->number "123b"))
(display "not a number")
(display "indeed a number"))
(display x))
式の結果を破棄していましたif
。条件は正常に機能していましたが、結果の文字列には何も行われず、無視されました。は、独自の値を持たない副作用のある操作である#<void>
ため、プロシージャ全体が返されます。また、変数とパラメータはまったく使用されていなかったため、display
削除しました。badInput
y
z
プロシージャから値を返すには、返す値を含む式をプロシージャの本体の最後に配置するだけです。これにより、コードが機能しなかった理由が説明されます。最後の式のみが値を返しますが、サイドで行うこともできます。 -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