2015-02-08 73 views
0

我正在用Racket編寫的函數感到困惑。我可能太習慣OCaml的let ... in語法。球拍創建函數/ lambda in

(define/public (get-rects) 
    (let wrap-edge ([(coords '()) (append coords tetramino-wh)]) 
     (case current-type 
      [(0) (vector 
       (wrap-edge (list 0 0)) 
       (wrap-edge (list tetramino-w 0)) 
       (wrap-edge (list (* 2 tetramino-w) 0)) 
       (wrap-edge (list (* 3 tetramino-w) 0)))]))) 

我試圖做沿此線的東西在像OCaml中:

let wrap_edge = ... in 
    // Create a vector using wrap-edge 

我不能換我的頭周圍做什麼最好的方法是。我知道將wrap-edge定義爲兄弟會很容易,但是如果我想要一種「讓步」的東西,定義並不是正確的選擇......雖然我可能會讓自己變得更加困難。它應該更像是:

(let ([wrap-edge (lambda (coords) (append coords tetramino-wh))])) 

這是唯一的選擇嗎?這樣做似乎很臃腫。

回答

3

對於這樣的事情,在Racket中使用define可能更習慣。你可以在你現有的函數中聲明一個函數,然後按正常方式使用它。

(define/public (get-rects) 
    (define (wrap-edge coords) 
    (append coords tetramino-wh)) 
    (case current-type 
    [(0) (vector 
      (wrap-edge (list 0 0)) 
      (wrap-edge (list tetramino-w 0)) 
      (wrap-edge (list (* 2 tetramino-w) 0)) 
      (wrap-edge (list (* 3 tetramino-w) 0)))])) 

又見建議有關let VS在Racket Style Guidedefine

+0

好的!感謝您的風格指南參考! – eatonphil 2015-02-09 00:06:13