Racket 中的 if 语句

Bre*_*ett 3 if-statement racket

我正在尝试构造一个函数“number-crop”,它需要三个参数 xa 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))
Run Code Online (Sandbox Code Playgroud)

我返回错误,“定义:预期函数体只有一个表达式,但发现了 1 个额外部分”。我是 Racket 的新手,所以我仍在尝试了解 if 语句在该语言中的工作方式。

Ale*_*ing 5

Scheme/Racketif表达式总是只有一个条件和两个分支。由于它们是表达式而不是语句,这使得它们非常有用,并且它们的功能很像 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]))
Run Code Online (Sandbox Code Playgroud)

(请注意,elsecond-内部是特殊的,它替换了最后一个子句的条件,并且如果其他情况失败,它总是运行。)

这可能会起作用,但是如果您已经可以访问minand max,则实际上根本不需要分支!如果将这两个函数一起使用,则可以number-crop既不使用if 也不 编写cond

(define (number-crop x a b)
  (min (max a x) b))
Run Code Online (Sandbox Code Playgroud)

这工作,因为这两种合成minmax能有效地遏止给定范围内的值,只要a是始终是最小值,b始终是最大的。