在从SICP学到了一点Scheme之后,我开始读《小阴谋家》(我觉得它很有趣),大约读完了四分之一。我注意到我可以写很多(大多数?全部?)解决方案不使用lambda,而Little Schemer 总是使用它们。例如,第一个定义是
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
除非我弄错了,否则可以更简单地写成
(define (atom? x)
(and (not (pair? x)) (not (null? x))))
如果我写的是lambda-less解决方案,我是不是遗漏了一些基本的东西?
发布于 2011-01-24 09:49:57
最初,define
只有一个语法,即将变量设置为一个值。这就是这些古老的(和永恒的)书籍中所使用的风格。后来,define
获得了一种不同的语法作为快捷方式,这就是您正在使用的方式。
为了好玩,搜索您的Scheme库,您可能会找到一个宏,它将非lambda表单扩展为旧的lambda重表单。
发布于 2011-01-24 11:02:27
我非常喜欢lambda
-heavy风格的教学,因为正如Jay所说的那样,它使函数的创建更加明确。
在学习时,您开始使用的简单函数(如atom?
)是顶级的define
d。这意味着使用您提到的defun
-style 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)))
当然,该语言支持这两种形式,因此最终会归结为风格。对我来说,当您的所有函数都是用lambda
编写的时候,define
的用法有一个吸引人的一致性:第一个参数始终是一个符号,第二个参数只是任何旧的表达式。对于任何函数式程序员来说,lambda
就像任何旧的表达式一样,这一事实是最重要的事情之一。
发布于 2011-01-24 11:42:56
您可以看到您的方案将这些快捷方式(宏)扩展为使用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
看起来一目了然。
https://stackoverflow.com/questions/4777865
复制相似问题