let 中的球拍创建函数/lambda

Posted

技术标签:

【中文标题】let 中的球拍创建函数/lambda【英文标题】:racket create function/lambda in let 【发布时间】:2015-04-08 15:51:09 【问题描述】:

我对我在 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

我不知道最好的方法是什么。我知道将 wrap-edge 定义为兄弟姐妹很容易,但如果我想定义一种“让进来”的东西,define 不是正确的选择……尽管我可能只是让自己变得更加困难。它应该更像:

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

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

【问题讨论】:

【参考方案1】:

对于这样的事情,在 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 中有关letdefine 的建议。

【讨论】:

好的!也感谢您提供样式指南参考!

以上是关于let 中的球拍创建函数/lambda的主要内容,如果未能解决你的问题,请参考以下文章

使用“let star”的球拍语法错误

如何将列表作为球拍中的参数列表传递?

是否可以在球拍中创建匿名递归函数

在 Scheme / Racket 中 let 的 lambda 定义是啥? [复制]

Kotlin标准库函数 ① ( apply 标准库函数 | let 标准库函数 )

有啥方法可以首先获取参数,最后在球拍中的函数中获取名称?