/ / Was ist in dieser rekursiven Sheme-Funktion los, die define nicht verwendet? - Rekursion, Funktionsprogrammierung, Schema

Was passiert in dieser rekursiven Sheme-Funktion, die nicht define verwendet? - Rekursion, funktionale Programmierung, Schema

Ich lese ein Buch mit dem Titel "Der kleine Schemer" und darin wird dieser Code als rekursive Methode dargestellt, um die Länge einer Liste zu ermitteln, ohne dass irgendwelche Funktionen definiert sind.

((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else ( add1
((mk-length mk-length)
(cdr l))))))))

Ich habe irgendwie die vage Vorstellung, dass die Funktionist ein Werkzeug, um mehr aus sich selbst zu machen, aber ich bin immer wieder verwirrt, wenn ich versuche, es vollständig zu durchdenken und wenn ich versuche, so etwas zu replizieren.

Kann jemand genauer erklären, was hier vor sich geht und warum es so wichtig ist (das Buch behandelte dies mit großer Bedeutung)?

Antworten:

1 für die Antwort № 1

Ich schlage vor, Sie versuchen, es selbst herauszufinden, indem Sie es mit durchgehen DrRacket

Fügen Sie den Code beim Öffnen einfach so ein, als wäre er eine Funktion mit einem beliebigen Listenargument, z. B .:

(((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else ( add1
((mk-length mk-length)
(cdr l))))))))
"(1 2 3))

Wählen Sie in der Dropdown-Liste unten die Option AuswählenSprache und dann im Modal "Intermediate student with lambda" auswählen. Dies ist ein eingeschränktes Schema mit weniger ausgefallenen Funktionen als der Standard, aber Ihr Code funktioniert wie geschrieben. Nachdem Sie RUN gedrückt haben, sehen Sie eine Step-Taste. Drücken Sie diese und Sie können das Ganze visuell durchlaufen.

Bild des Steppers, der den allerersten Schritt zeigt!

Dies zeigt den Stepper, der den ersten Schritt macht.

NB: DrRackets Sprache "Intermediate student with lambda" funktioniert möglicherweise nicht mit allen Codes im Buch. Es ist Teil des Buches Wie man Programme entwirft und aus mehreren Sprachen mit unterschiedlicher Komplexität besteht. Siehe die Formulare in diese Dokumentationsseite. DrRacket unterstützt die Standards R5RS, R6RS und R7RS ist auf dem Weg und es hat auch eine freche, nicht standardmäßige Implementierung mit dem Namen #lang racket Das gibt Ihnen Unmengen von Bibliotheken, sperrt Sie jedoch ein, damit Sie nur in dieser Implementierung ausgeführt werden können.