为什么我不能 return false,但我可以 return true,在这个函数中? (球拍)

Why can't I return false, but I can return true, in this function? (Racket)

目标是检查非负数的数字是否按升序排列。

这是我的代码:

(define (in-order-iter num)
  (define (aux num-left result-so-far)
    (cond ((equal? result-so-far #f) #f)
          ((< num-left 10) result-so-far)
          ((aux (quotient num-left 10) (< (modulo (quotient num-left 10) 10)(modulo num-left 10))))))
  (aux num #t))

(in-order-iter 321)

最糟糕的是,当我决定使用 (display result-so-far) 时,我得到了我想要的答案(即 #f),但我的函数不会 return 它。如果我决定使用 (in-order-iter 123),它会 return #t。 当我测试

(< (modulo (quotient 321 10) 10)(modulo 321 10)))

单独,它会 return #f,所以它应该将 result-so-far 更改为 #f

为什么我会这样?!

编辑:顺便说一句,我可以递归地执行此函数并且它有效:

(define (in-order-recur num)
  (if (> num 10)
      (if (< (modulo (quotient num 10) 10) (modulo num 10))
            (in-order-recur (quotient num 10))
            #f)
      #t))    

(in-order-recur 100000)

您应该使用 else 子句作为最后一个 cond 术语:

(define (in-order-iter num)
  (define (aux num-left result-so-far)
    (cond ((equal? result-so-far #f) #f)
          ((< num-left 10) result-so-far)
          (else (aux (quotient num-left 10) 
                     (< (modulo (quotient num-left 10) 10)
                        (modulo num-left 10))))))
  (aux num #t))

所以当你不这样做时,#f 会变成谓词,因为它是假的,所以它会进入下一个术语。由于您没有更多的条款,因此由实施来决定 cond 的结果应该是什么。来自 R6RS 的建议是“未指定的值”。例如。 Racket 将导致 #<void> 默认情况下不会打印。实际上,虽然实现可能会做这样的事情:

(define (in-order-iter num)
  (define (aux num-left result-so-far)
    (cond ((equal? result-so-far #f) #f)
          ((< num-left 10) result-so-far)
          ((aux (quotient num-left 10) 
                (< (modulo (quotient num-left 10) 10)
                   (modulo num-left 10))))
          (else "BaNaNa")))
  (aux num #t))

依赖于作为值返回的内容,例如。 MIT Scheme returns 一些有用的值,会将您锁定在特定的方言中并且不可移植。

如果基本情况下的值为真,则默认情况下将为 #t。然后,由于该术语没有结果部分,因此 #t 是返回值。