是否使用lambda在Racket中定义函数

时间:2018-12-10 15:32:39

标签: racket

我正在学习球拍,以前我用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。

我必须声明一个函数时需要使用lambda吗?

1 个答案:

答案 0 :(得分:0)

如评论中所述,您无需使用lambda。使用非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