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))
)

是的,在和中的书中对此进行了解释。也是在这个博客里。是的,这在和中的书中有解释。也在这个博客里。