0

我正在尝试比较两个布尔值:

(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它是一个没有自身价值的副作用操作。另外,我删除了badInput变量和yandz参数,因为它们根本没有被使用。

要从过程中返回值,只需将带有要返回的值的表达式放在过程主体的末尾 - 这解释了为什么您的代码不起作用,只有最后一个表达式返回一个值,尽管您可以做侧-display在最后一个表达式之前和包括最后一个表达式的情况下执行操作(例如,调用)。

事实上,您的代码可以通过返回一个值以更惯用的方式编写,注意ifnow 中的条件实际上取决于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

这样做的原因是即使您的条件评估为假,您只是丢弃了该结果。

您输入的内容相当于:

(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

这将是一个矫枉过正,但您可以通过调用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 回答
1

函数的值是其主体中最后一个表达式的值。testing函数体中的最后一个表达式是(display x),这就是函数的值。由于 yourif不是正文中的最后一个表达式并且它没有任何副作用,因此它基本上什么都不做。

如果您if在调用后将您的移动到displaytesting将显示x然后返回“不是数字”。

于 2012-12-15T16:28:30.907 回答