Использовать или нет лямбда для определения функции в Racket - PullRequest
0 голосов
/ 10 декабря 2018

Я изучаю ракетку, и я использовал lambda для определения своих функций.Но я обнаружил, что использовать его не нужно (насколько я знаю).

Я пробовал эти две функции в DrRacket, и обе они возвращают один и тот же результат:

#lang racket
(define factorial
  (lambda (number)
    (cond ((not (number? number))
           (error 'factorial "number is not a number"))
          ((equal? number 0)
           1)
          (else
           (* number (factorial (- number 1)))))))

(define (factorial1 number)
    (cond ((not (number? number))
           (error 'factorial1 "number is not a number"))
          ((equal? number 0)
           1)
          (else
           (* number (factorial1 (- number 1))))))

Второй, factorial1, не использует лямбду.

Нужно ли использовать lambda, когда мне нужно объявить функцию?

1 Ответ

0 голосов
/ 11 декабря 2018

Как сказано в комментариях, вам не нужно использовать lambda.Возможно, более обычным и удобным является использование не лямбда-версии для определения функции

Если вы используете макрос-шагер в DrRacket, вы можете увидеть, как расширяется ваша программа.(define (factorial1 number) etc.) становится следующим:

(define-values (factorial1)
 (lambda (number)
   (if (#%app not (#%app number? number))
     (let-values () (#%app error 'factorial1 (quote "number is not a number")))
     (if (#%app equal? number (quote 0))
       (let-values () (quote 1))
       (let-values () (#%app * number (#%app factorial1 (#%app - number (quote 1)))))))))

Интересно, что обе define формы, определения функций и значения расширяются до define-values

...