If statement 球拍中的If语句

If statement 球拍中的If语句,if-statement,racket,If Statement,Racket,我试图构造一个函数“number crop”,它接受三个参数x a b。如果x位于数字行上闭合间隔[a,b]的左侧,则返回a。如果x在间隔的右侧,则返回b。否则,只需返回x。这就是我所拥有的: (define (number-crop x a b) (if (max x a b) x b) (if (min x a b) x a)) 返回的错误是“define:函数体应该只有一个表达式,但找到了一个额外的部分”。我对Racket还不熟悉,所以我仍在努力理解if语句在该语言中是如何工作的

我试图构造一个函数“number crop”,它接受三个参数x a b。如果x位于数字行上闭合间隔[a,b]的左侧,则返回a。如果x在间隔的右侧,则返回b。否则,只需返回x。这就是我所拥有的:

(define (number-crop x a b)
  (if (max x a b) x b)
  (if (min x a b) x a))
返回的错误是“define:函数体应该只有一个表达式,但找到了一个额外的部分”。我对Racket还不熟悉,所以我仍在努力理解if语句在该语言中是如何工作的。

在Scheme(Racket)中,函数被定义为返回一件事。在您的情况下,很明显:您描述的操作的结果。然而,Scheme在几个方面不同于大多数命令式语言。例如,如果查看定义中的表达式,它包含两个表达式,一个接一个。这与Scheme中的“计算函数的一个表达式”假设相矛盾

此外,即使您使用命令式语言编写,您也会使用嵌套的ifs,当然您可以在这里使用它。大致如下:

(define (number-crop x a b)
  (if (= x (max x a b))
      b
      (if (= x (min x a b))
          a
          x)))

Scheme/Racket
if
表达式始终只有一个条件和两个分支。因为它们是表达式,而不是语句,这使得它们非常有用,并且它们的功能非常类似于C族语言中的条件“三元”运算符。但是,当您有多个条件时,您可能需要更接近
if…else if
链的条件,这是通过
cond
表单提供的

cond
表单类似于
if
,不同之处在于它可以包含任意数量的“子句”,每个“子句”由单个条件确定。使用
cond
,您的
number-crop
函数如下所示:

(define (number-crop x a b)
  (cond
    [(< x a) a]
    [(> x b) b]
    [else    x]))
这是因为如果
a
始终是最小值,
b
始终是最大值,那么组合
min
max
将有效地将值钳制在给定范围内

(define (number-crop x a b)
  (min (max a x) b))