如何将 let* 表示为 lambda 表达式(不是常规 let)
Posted
技术标签:
【中文标题】如何将 let* 表示为 lambda 表达式(不是常规 let)【英文标题】:How to express let* as a lambda expression (not the regular let) 【发布时间】:2013-05-17 21:43:23 【问题描述】:我有一个与方案相关的问题,我们如何将 let* 实现为 lambda 表达式。更准确地说,我不是想知道“常规”let,而是带 * 的 let 让我们在另一个中使用一个 let 表达式。
【问题讨论】:
看看这个:***.com/questions/15003518/… 【参考方案1】:let*
表单是一系列嵌套的lambda
s。例如,这个:
(let* ((a 10)
(b (+ 10 a)))
(+ a b))
相当于这个:
((lambda (a)
((lambda (b)
(+ a b))
(+ 10 a)))
10)
【讨论】:
感谢您的回答,现在很有意义!【参考方案2】:既然您不知道“常规”let
,如果let*
可以转换为let
,那么您将得到答案。因此要知道:
(let* ((a ...) (b ...) (c ...)) body ...)
相当于:
(let ((a ...))
(let ((b ...))
(let ((c ...))
body ...)))
(参见 R5RS,第 44 页,(define-syntax let* ...)
)。现在,鉴于此,并且知道:
(let ((a ...)) body ...)
相当于:
((lambda (a) body ...) ...)
我上面展示的let*
的“扩展”变为:
((lambda (a)
((lambda (b)
((lambda (c)
body ...)
<c-init>))
<b-init>))
<a-init>)
【讨论】:
以上是关于如何将 let* 表示为 lambda 表达式(不是常规 let)的主要内容,如果未能解决你的问题,请参考以下文章
在 Scheme / Racket 中 let 的 lambda 定义是啥? [复制]