如果在Racket

时间:2016-01-22 21:24:32

标签: 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:期望只有一个函数体的表达式,但找到了1个额外的部分"。我是Racket的新手,所以我仍然试图理解if语句是如何在语言中工作的。

2 个答案:

答案 0 :(得分:4)

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]))

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

这可能会有效,但如果您已经有minmax的访问权限,则根本不需要分支!如果您同时使用这两个功能,则可以使用number-crop if编写cond

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

这是有效的,因为组合minmax会有效地限制给定范围内的值,前提是a始终是最小值,b始终是最大值

答案 1 :(得分:2)

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

此外,即使你用命令式语言编写它,你也可以使用嵌套的ifs,你当然可以在这里使用。有点像:

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