2016-04-01 2 views
0

, поэтому я пытаюсь поэкспериментировать с некоторым кодом и изменять между двумя методами выражения схемы let и lambda.Схема: конвертировать из Let to 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))))) 

Я пытаюсь изменить внешний пусть определений формате лямбда, но это немного сбивает с толку из-за вложенной природы кода , То, что я пытался сделать до сих пор:

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

Это явно не так, но я не знаю, как поступить дальше ...

+0

Вы почти правы: с лямбды не имеют имен, ваш список args неверен (это должно быть '(lambda (lmr) ...)'), и вам нужно назначить его привязке, возможно, с 'letrec'. Затем вы хотите вызвать его с использованием этого имени, передав ему начальные аргументы. –

+0

Спасибо, я попробую! Как насчет внутреннего блока, такого как '(splice (cons m l) (car r) (cdr r))', где рекурсивно используются определения let? Будут ли они работать с привязанной лямбдой или будут ли они нуждаться в дальнейшем изменении? – Starscreen60

ответ

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)) 
+0

Благодарим вас за разъяснение способа обработки. Спасибо также @AlexisKing за разъяснение моих сомнений в синтаксисе трансформации :) – Starscreen60