scheme - 让作为 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 有位置参数、可选参数、剩余参数和关键字参数。
函数形式有参数形式。每个参数形式都被评估,然后使用参数值调用函数。参数(局部变量)绑定到参数值并执行主体。
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>
)
推荐阅读
- json - 尝试使用jq在一行上格式化json数据
- python - 如何摆脱 Google Colab 中的以下错误 - 超出 IOPub 数据速率
- clojure - 语法错误 (FileNotFoundException) 无法在类路径上找到 [name].class、[name].clj 或 [name].cljc
- spring-security - 使用没有 JWK 的 Spring Security OAuth 2.0 资源服务器
- python - 在我的 PayPal 服务器端集成中,付款弹出窗口立即关闭。我该如何解决?
- azure - 读取 azure 表单识别器的 pdf 文件时出现问题
- python - 获取两个图像之间的增量更新
- r - 正在运行的代码块中的 Rmarkdown 表在预览中太轻 (Kable)
- reactjs - 在 React 中,我的
- python - 带有 re.DOTALL 的 finditer 从 span=(16,17) 开始分析。为什么?