2016-01-22 77 views
2

我想構建一個函數「數字作物」,它需要三個參數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)) 

我與返回錯誤,「定義:預期的函數體只有一個表情,卻發現1周額外的一部分」。我是Racket的新手,所以我仍然試圖理解語言是如何在語言中起作用的。

回答

2

在Scheme(球拍)中,函數被定義爲返回一件事情。你的情況很明顯:你描述的操作的結果。然而,Scheme在幾個方面與大多數命令式語言不同。例如,如果您在定義內部查看錶達式,它將一個接一個地包含兩個表達式。這與Scheme中的「計算函數的一個表達式」假設相矛盾。

此外,即使你用命令式語言編寫它,你也會使用嵌套的ifs,你當然可以在這裏使用。沿着線的東西:

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

計劃/球拍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始終是最大值。