2015-02-08 51 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