2016-04-01 18 views
0

Also versuche ich mit etwas Code zu experimentieren und zwischen den beiden Schema-Ausdrucksmethoden von und Lambda zu wechseln.Schema: Konvertieren von Let zu Lambda

Der Code ich habe, ist wie folgt:

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

Ich versuche, die äußerste lassen Definitionen Lambda Format zu ändern, aber es ist ein bisschen verwirrend aufgrund der verschachtelten Natur des Codes . Was habe ich versucht, so weit zu tun ist:

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

Dies ist eindeutig falsch, aber ich weiß nicht, wie weiter verfahren ist ...

+0

sind Sie fast richtig: da lambdas keine Namen haben, Ihre Argumentliste ist falsch (es sollte '(Lambda (lmr) ...)') sein, und Sie müssen es einer Bindung zuweisen, wahrscheinlich mit 'letrec'. Dann möchten Sie ihn unter Verwendung dieses Namens aufrufen und ihm die Anfangsargumente übergeben. –

+0

Danke, ich werde das ausprobieren! Was ist mit dem inneren Block wie '' splice (cons m l) (Auto r) (cdr r)) 'wo die Let-Definitionen rekursiv verwendet werden? Arbeiten diese mit dem gebundenen Lambda oder wird das weiter modifiziert werden müssen? – Starscreen60

Antwort

0

Ich schrieb a post about how let is transformed into lambda behind the scenes, die Sie nützlich finden können.

Nach der Expansion in meinem Beitrag beschrieben, Ihr Code würde erweitern in:

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

, die dann erweitert zu:

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

Vielen Dank für die Klärung der Art, wie mit der Erweiterung umgegangen wird. Danke auch @AlexisKing für die Klärung meiner Zweifel an der Transformations-Syntax :) – Starscreen60