尝试这个:
(define (testing x)
(if (equal? #f (string->number "123b"))
(display "not a number")
(display "indeed a number"))
(display x))
您正在丢弃if
表达式的结果。条件工作正常,但没有对结果字符串做任何事情,它只是被忽略了。整个过程现在正在返回#<void>
,因为display
它是一个没有自身价值的副作用操作。另外,我删除了badInput
变量和y
andz
参数,因为它们根本没有被使用。
要从过程中返回值,只需将带有要返回的值的表达式放在过程主体的末尾 - 这解释了为什么您的代码不起作用,只有最后一个表达式返回一个值,尽管您可以做侧-display
在最后一个表达式之前和包括最后一个表达式的情况下执行操作(例如,调用)。
事实上,您的代码可以通过返回一个值以更惯用的方式编写,注意if
now 中的条件实际上取决于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