微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

让作为 lambda 的语法糖

如何解决让作为 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 语法有什么好处?将键/值对放在一起是否更容易阅读?

解决方法

(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 有位置、可选、rest 和关键字参数。

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

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>

   )
,

不仅更易读;使用 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 version:
2,3
5,6

以及相同结构的 lambda 版本:

((lambda (x y)
   ((lambda (u v)
       (display "lambda version:\n")
       (for-each display (list x "," v "\n")))
    (+ x y) (* x y))) 2 3)
lambda version:
2,6

两个版本都有效,但 let 版本通过使用适当的语法表达了意图lambda 版本仅通过其构造的语义来表达意图。如果您不知道允许表达 let 绑定思想的习语,或者您无法通过分析代码拼凑出正在发生的事情,那么 lambda 版本的含义是不透明的.但是 let 版本通过使用专用于 let 绑定的语法清楚地表明了其意图。

此外,随着 let 绑定场景变​​得越来越复杂,使用 let 将大部分复杂性卸载到语法中。上面的例子是一个简单的嵌套let,在lambda版本中已经很容易出错了。您必须确保括号放置正确(我在编写示例代码时实际上设法弄错了一个),并且最终版本将所有变量标识符放置在构造的开头,所有的边界值在最后。这意味着要理解 lambda 版本,您必须不断参考开头和结尾,以了解正文中发生的事情。

一般来说,lambda 表示非常笼统的想法,但 let 表示经常需要的更具体的想法。 let 语法的优势在于,它允许您以一种更容易、更简洁、更易读的方式表达更具体的想法,而不是总是通过更一般的方式来表达特定的想法。想法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。