Function 方案:从Let转换为Lambda

Function 方案:从Let转换为Lambda,function,lambda,scheme,let,chicken-scheme,Function,Lambda,Scheme,Let,Chicken Scheme,因此,我尝试使用一些代码,并在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))))) 我试图

因此,我尝试使用一些代码,并在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))
这显然是错误的,但我不知道如何继续…

我写道,你可能会发现这很有帮助

根据我文章中描述的扩展,您的代码将扩展为:

((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))

您几乎是对的:因为lambda没有名称,所以您的args列表是错误的(它应该是
(lambda(l m r)…)
),您需要将其分配给绑定,可能是使用
letrec
。然后您想使用该名称调用它,并将初始参数传递给它。谢谢,我会尝试一下!对于内部块,例如递归使用let定义的
(拼接(cons m l)(car r)(cdr r r))
,如何处理?这些会与绑定的lambda一起工作还是需要进一步修改?感谢您澄清处理扩展的方式。还感谢@AlexisKing澄清了我对转换语法的疑问:)