首页 > 解决方案 > 让作为 lambda 的语法糖

问题描述

以下是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>)

let使用语法有什么好处?将键/值对彼此相邻放置是否更容易阅读?

标签: schemelispsicp

解决方案


(lambda (key1 key2 ...) <body> (val1 val2 ...))
-->
(let ((key1 val1) (key2 val2) ...) <body>)

第一个模式实际上是这样的:

((lambda (par1 par2 ...) <body>) arg1 arg2 ...)
-->
(let ((par1 arg1) (par2 arg2) ...) <body>)

该函数有参数。Common Lisp 有位置参数、可选参数、剩余参数和关键字参数。

函数形式有参数形式。每个参数形式都被评估,然后使用参数值调用函数。参数(局部变量)绑定到参数值并执行主体。

let 的主要好处是更容易查看哪个参数具有哪种参数形式以及必须提供多少个参数(可能还有哪些)。

想象:

((lambda (a b c d e f)
 
 <long body>           ; and yes the body can get long

 )

 1 2 3 4 5 5)

请注意,有很多代码正文超过五行。

let参数表单移到顶部,更容易看到评估身体的环境是什么:

(let ((a 1)
      (b 2)
      (c 3)
      (d 4)
      (e 5)
      (d 6))

   <long body>

   )

甚至

(let ((a 1) (b 2) (c 3) (d 4) (e 5) (d 6))

   <long body>

   )

推荐阅读