racket在let中创建函数/ lambda

时间:2015-02-08 23:47:42

标签: lambda scheme ocaml racket let

我对在Racket中写作的功能感到非常困惑。我可能已经习惯了OCaml的let ... 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

我无法解决最好的方法。我知道将包装边缘定义为兄弟会很容易,但如果我想要进入"让我们进入"那种事情,定义不是正确的选择......虽然我可能只是在对自己进行任意改变。它应该更像是:

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

这是唯一的选择吗?这样做真是太臃肿了。

1 个答案:

答案 0 :(得分: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)))]))

另请参阅Racket Style Guide中有关let vs define的建议。