2015-02-08 1 views
0

Я получаю супер запутанную функцию, которую я пишу в Racket. Возможно, я слишком привык к синтаксису let ... in от OCaml.racket create function/lambda in let

(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))])) 

Это единственный вариант? Просто кажется, что это так раздуто.

ответ

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 против define в Racket Style Guide.

+0

Хорошо! Спасибо за ссылку на руководство по стилю! – eatonphil