【问题标题】:Scheme: Convert from Let to Lambda方案:从 Let 转换为 Lambda
【发布时间】:2016-07-21 13:23:51
【问题描述】:

所以我正在尝试一些代码,并在 letlambda 两种方案表达方法之间进行更改。

我的代码如下:

(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,还是需要进一步修改?

标签: function lambda scheme let chicken-scheme


【解决方案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 澄清了我对转换语法的疑虑 :)
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2016-04-03
  • 2021-03-07
  • 2018-08-30
  • 2011-12-23
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多