方案:从 Let 转换为 Lambda
Posted
技术标签:
【中文标题】方案:从 Let 转换为 Lambda【英文标题】:Scheme: Convert from Let to Lambda 【发布时间】:2016-07-21 13:23:51 【问题描述】:所以我正在尝试一些代码,并在 let 和 lambda 两种方案表达方法之间进行更改。
我的代码如下:
(let splice ((l '()) (m (car s)) (r (cdr s)))
(append
(map (lambda (x) (cons m x)) (perm (append l r)))
(if (null? r) '()
(splice (cons m l) (car r) (cdr r)))))
我正在尝试将最外层的 let 定义更改为 lambda 格式,但由于代码的嵌套性质,这有点令人困惑。到目前为止,我尝试做的是:
(lambda (splice (l m r))
(append
(map (lambda (x) (cons m x)) (perm (append l r)))
(if (null? r) '()
(cut (cons m l) (car r) (cdr r)))))
(('()) (car upList) (cdr upList))
这显然是错误的,但我不知道如何进一步......
【问题讨论】:
你几乎是对的:因为 lambdas 没有名称,所以你的 args 列表是错误的(应该是(lambda (l m r) ...)
),你需要将它分配给一个绑定,可能是 letrec
.然后,您想使用该名称调用它,并将初始参数传递给它。
谢谢,我试试看!像(splice (cons m l) (car r) (cdr r))
这样递归使用let 定义的内部块呢?这些是否适用于绑定的 lambda,还是需要进一步修改?
【参考方案1】:
我写了a post about how let
is transformed into lambda
behind the scenes,您可能会觉得有帮助。
根据我帖子中描述的扩展,您的代码将扩展为:
((rec (splice l m r)
(append (map (lambda (x) (cons m x)) (perm (append l r)))
(if (null? r)
'()
(splice (cons m l) (car r) (cdr r)))))
'() (car s) (cdr s))
然后扩展为:
((letrec ((splice (lambda (l m r)
(append (map (lambda (x) (cons m x)) (perm (append l r)))
(if (null? r)
'()
(splice (cons m l) (car r) (cdr r)))))))
splice)
'() (car s) (cdr s))
【讨论】:
感谢您阐明处理扩展的方式。也感谢@AlexisKing 澄清了我对转换语法的疑虑 :)以上是关于方案:从 Let 转换为 Lambda的主要内容,如果未能解决你的问题,请参考以下文章
如何从 PostgreSQL 查询转换为 LINQ 或 lambda 表达式
使用 lambda 中的 pandas 从 s3 读取 excel 文件并转换为 csv