首页 > 解决方案 > 使用或不使用 lambda 在 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必须声明函数时是否需要使用?

标签: racket

解决方案


正如评论中所说,您不需要使用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


推荐阅读