从SICP学习了一些方案后,我开始阅读《小计划》(我觉得很有趣),大约四分之一。我注意到如果不使用lambda,我可以写很多(大多数?全部?)解决方案 总是 使用它们。例如,第一个定义是

(define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))

除非我误会,否则可以更简单地写

(define (atom? x) 
   (and (not (pair? x)) (not (null? x))))

如果我写无Lambda的解决方案,我会错过一些基本的东西吗?

有帮助吗?

解决方案

起初, define 具有单个语法,以将变量设置为值。这就是如此古老(和永恒)的书籍中使用的风格。稍后的, define 获得了不同的语法作为快捷方式,这是您使用的语法。

只是为了娱乐,在您的计划库上搜索,您可能会发现一个宏,将非lambda表格扩展到旧的lambda较重的形式中。

其他提示

我非常喜欢 lambda- 正如杰伊(Jay)所说,这使教学风格更明确,因为它使功能更加明确。

学习时,简单的功能您从喜欢 atom?defineD在顶层。这意味着使用 defun-风格 define 你提到。

但是,当您开始使用函数作为一流值时,例如 map, ,你会看到 lambda 这是第一次,这似乎比实际上更奇怪,更神奇。

相反,如果您一直在定义功能 lambda 一直以来,看到函数就像其他任何值一样,这并不是一场飞跃。它们恰好在 define 几乎经常,但与数字或引用常数没有什么不同:

(define x 1)
(define l '(2 3 4 5))
(define s (cons x ls))
(define f (lambda (n) (+ n 2)))

当然,该语言支持两种形式,因此最终归结为风格。对我来说,使用的使用是一种吸引人的一致性 define 当您的所有功能都与 lambda: :第一个论点始终是一个符号,第二个论点只是任何旧表达式。以及事实 lambda 就像任何旧的表达方式一样,都是任何功能程序员学习的最重要的事情之一。

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

MZScheme 4.2.4(与Drscheme一起):

> (expand '(define (add1 x) (+ 1 x)))
#<syntax (define-values (add1) (lambda...>
(define-values
  (add1)
  (lambda (x) (apply + '1 x)))

Chez方案8.0:

> (expand '(define (add1 x) (+ 1 x)))
(begin
  (set! add1
    (lambda (x)
      (+ 1 x)))
  (void))

lambda 看起来很普通。

我隐约记得一位教授讨论这样的事情。

我认为使用Lambda解决方案的原因有两个:

第一个纯粹是历史上的事情。在某个时候,这是唯一可能的方法。因此,有些人仍然使用该方法。

第二是,有些人只是喜欢对创建功能的事实更加明确,因此他们喜欢看到lambda一词。

因此,我相信选择归结为您个人最喜欢的东西。

我正在阅读一些有关Lambda Cyculus(Simon Peyton Jones的实现“功能编程语言的实现”;在线使用免费PDF)。因此,这只是一个猜测,但我相信TLS的作者希望您在思考中真的很笨拙。他们没有出来说这句话,但是有提示(查看TLS的第107页),这只是Applied lambda calc中的练习。因此,也许他们在不说:“我的朋友,您正在做Lambda抽象!”

Little Schemer使用伪代码方案(为教育目的进行简化,无关实施)。当今的标准方案有一个定义的定义,您在其中隐式调用lambda(请参阅 http://www.cs.cmu.edu/groups/ai/html/r4rs/r4rs_7.html)。 Little Schemer方案非常简单,不包括此替代形式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top