racket - 使用或不使用 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
必须声明函数时是否需要使用?
解决方案
正如评论中所说,您不需要使用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
推荐阅读
- machine-learning - 我无法解决 SVR | 中的错误“ValueError: Expected 2D array, got 1D array:” 机器学习
- javascript - JQuery .each() "this" 关键字与 JS 类 "this" 关键字
- vb.net - 如何测试列表是否具有具有特定属性值的对象
- ruby - 在 Ruby 中定义 String#prev 方法
- c++ - CStatic.setBitmap 导致矩形在 onpaint 中闪烁(MFC)
- android - 从数据库中获取信息总是返回 -1
- firebase - 使用 Firestore 查询未定义 POST 请求正文
- python-3.x - 从对象列表中喷出某个属性
- azure-ad-b2c - 如何在持久声明中使用声明解析器?
- java - FirebaseRecyclerAdapter 不开始监听