首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在“小阴谋家”里有那么多拉姆达斯?

为什么在“小阴谋家”里有那么多拉姆达斯?
EN

Stack Overflow用户
提问于 2011-01-24 09:42:58
回答 6查看 3.1K关注 0票数 19

在从SICP学到了一点Scheme之后,我开始读《小阴谋家》(我觉得它很有趣),大约读完了四分之一。我注意到我可以写很多(大多数?全部?)解决方案不使用lambda,而Little Schemer 总是使用它们。例如,第一个定义是

代码语言:javascript
复制
(define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))

除非我弄错了,否则可以更简单地写成

代码语言:javascript
复制
(define (atom? x) 
   (and (not (pair? x)) (not (null? x))))

如果我写的是lambda-less解决方案,我是不是遗漏了一些基本的东西?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-24 09:49:57

最初,define只有一个语法,即将变量设置为一个值。这就是这些古老的(和永恒的)书籍中所使用的风格。后来,define获得了一种不同的语法作为快捷方式,这就是您正在使用的方式。

为了好玩,搜索您的Scheme库,您可能会找到一个宏,它将非lambda表单扩展为旧的lambda重表单。

票数 15
EN

Stack Overflow用户

发布于 2011-01-24 11:02:27

我非常喜欢lambda-heavy风格的教学,因为正如Jay所说的那样,它使函数的创建更加明确。

在学习时,您开始使用的简单函数(如atom? )是顶级的defined。这意味着使用您提到的defun-style define创建函数是可能的,而且更加紧凑。

然而,当你开始使用函数作为第一类值时,例如,作为map的参数,你会第一次看到lambda,它可能看起来比实际更奇怪更神奇。

相反,如果您一直在使用lambda定义函数,那么就会发现函数和其他值一样。它们恰好经常出现在define的右侧,但与数字或带引号的常量没有区别:

代码语言:javascript
复制
(define x 1)
(define l '(2 3 4 5))
(define s (cons x ls))
(define f (lambda (n) (+ n 2)))

当然,该语言支持这两种形式,因此最终会归结为风格。对我来说,当您的所有函数都是用lambda编写的时候,define的用法有一个吸引人的一致性:第一个参数始终是一个符号,第二个参数只是任何旧的表达式。对于任何函数式程序员来说,lambda就像任何旧的表达式一样,这一事实是最重要的事情之一。

票数 23
EN

Stack Overflow用户

发布于 2011-01-24 11:42:56

您可以看到您的方案将这些快捷方式(宏)扩展为使用expand (如果支持):

mzscheme 4.2.4 (带DrScheme):

代码语言:javascript
复制
> (expand '(define (add1 x) (+ 1 x)))
#<syntax (define-values (add1) (lambda...>
(define-values
  (add1)
  (lambda (x) (apply + '1 x)))

Chez方案8.0:

代码语言:javascript
复制
> (expand '(define (add1 x) (+ 1 x)))
(begin
  (set! add1
    (lambda (x)
      (+ 1 x)))
  (void))

lambda看起来一目了然。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4777865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档