方案:从Let转换为Lambda

时间:2016-04-01 16:30:50

标签: function lambda scheme let chicken-scheme

所以我试图尝试一些代码并在 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))

这显然是错的,但我不知道如何继续......

1 个答案:

答案 0 :(得分:0)

我写了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))