Scheme 让我们把它作为lambda的语法糖
以下是Scheme 让我们把它作为lambda的语法糖,scheme,lisp,sicp,Scheme,Lisp,Sicp,以下是let语句如何根据lambda解析的 (let((a 4)(b 5)) (+ a b)) --> ((lambda (a b) (+ a b)) 4 5) 一般形式是否符合以下内容: (lambda (key1 key2 ...) <body> (val1 val2 ...)) --> (let ((key1 val1) (key2 val2) ...) <body>) (lambda(key1-key2…(val1-val2…) --> (让((键
let
语句如何根据lambda
解析的
(let((a 4)(b 5)) (+ a b))
-->
((lambda (a b) (+ a b)) 4 5)
一般形式是否符合以下内容:
(lambda (key1 key2 ...) <body> (val1 val2 ...))
-->
(let ((key1 val1) (key2 val2) ...) <body>)
(lambda(key1-key2…(val1-val2…)
-->
(让((键1的值1)(键2的值2)…)
使用
let
语法有什么好处?将键/值对放在一起只是为了更容易阅读吗?不仅仅是为了更容易阅读;使用let
编写代码比使用lambda
来表示let
更容易。考虑:
(let ((x 2)
(y 3))
(let ((u (+ x y))
(v (* x y)))
(display "let version:\n")
(for-each display (list x ", " y "\n" u ", " v "\n"))))
let版本:
2, 3
5, 6
以及同一构造的lambda
版本:
((lambda (x y)
((lambda (u v)
(display "lambda version:\n")
(for-each display (list x ", " y "\n" u ", " v "\n")))
(+ x y) (* x y))) 2 3)
lambda版本:
2, 3
5, 6
两个版本都可以工作,但是let
版本通过使用适当的语法来表达意图。lambda
版本仅通过其结构的语义来表达意图。如果您不知道允许表达let
绑定思想的习惯用法,或者您无法通过分析代码将发生的事情拼凑在一起,那么lambda
版本的含义是不透明的。但是let
版本通过使用专用于let
绑定的语法清楚地说明了它的意图
此外,随着让
绑定场景变得更加复杂,使用让
将相当一部分复杂性转移到语法上。上面的示例是一个简单的嵌套let
,在lambda
版本中很容易出错。您必须确保括号的位置正确(在编写示例代码时,我实际上设法将其中一个放错了位置),最终版本将所有变量标识符放在构造的开头,所有绑定值放在末尾。这意味着要理解lambda
版本,您必须不断引用开头和结尾,以了解身体中发生了什么
一般来说,
lambda
表达了一个非常笼统的想法,但是let
表达了一个通常需要的更具体的想法。let
语法的优点是,它允许您轻松、简洁、易读地表达更具体的想法,与通常通过更一般的想法来表达特定想法相比,这种表达方式更不容易出错。不仅更易于阅读;使用let
编写代码比使用lambda
来表示let
更容易。考虑:
(let ((x 2)
(y 3))
(let ((u (+ x y))
(v (* x y)))
(display "let version:\n")
(for-each display (list x ", " y "\n" u ", " v "\n"))))
(lambda (key1 key2 ...) <body> (val1 val2 ...))
-->
(let ((key1 val1) (key2 val2) ...) <body>)
let版本:
2, 3
5, 6
以及同一构造的lambda
版本:
((lambda (x y)
((lambda (u v)
(display "lambda version:\n")
(for-each display (list x ", " y "\n" u ", " v "\n")))
(+ x y) (* x y))) 2 3)
lambda版本:
2, 3
5, 6
两个版本都可以工作,但是let
版本通过使用适当的语法来表达意图。lambda
版本仅通过其结构的语义来表达意图。如果您不知道允许表达let
绑定思想的习惯用法,或者您无法通过分析代码将发生的事情拼凑在一起,那么lambda
版本的含义是不透明的。但是let
版本通过使用专用于let
绑定的语法清楚地说明了它的意图
此外,随着让
绑定场景变得更加复杂,使用让
将相当一部分复杂性转移到语法上。上面的示例是一个简单的嵌套let
,在lambda
版本中很容易出错。您必须确保括号的位置正确(在编写示例代码时,我实际上设法将其中一个放错了位置),最终版本将所有变量标识符放在构造的开头,所有绑定值放在末尾。这意味着要理解lambda
版本,您必须不断引用开头和结尾,以了解身体中发生了什么
一般来说,lambda
表达了一个非常笼统的想法,但是let
表达了一个通常需要的更具体的想法。let
语法的优点是,它允许您轻松、简洁、易读地表达更具体的想法,而不是总是按照更一般的想法来表达特定的想法
(lambda (key1 key2 ...) <body> (val1 val2 ...))
-->
(let ((key1 val1) (key2 val2) ...) <body>)
甚至
(let ((a 1) (b 2) (c 3) (d 4) (e 5) (d 6))
<long body>
)
(let((a1)(b2)(c3)(d4)(e5)(d6))
)
甚至
(let ((a 1) (b 2) (c 3) (d 4) (e 5) (d 6))
<long body>
)
(let((a1)(b2)(c3)(d4)(e5)(d6))
)
是的,在和中的书中对此进行了解释。也是在这个博客里。是的,这在和中的书中有解释。也在这个博客里。