frage zu uebungsblatt 9 aufgabe 33 c

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

frage zu uebungsblatt 9 aufgabe 33 c
wieso kommt da (hi . hi) raus

bitte ne anstaendige und leicht verstaendliche erklaerung… danke


(let ((hi ’hihi))
   (define (hi hi)
       (lambda (hi) (cons hi hi)))
((hi hi) ’hi))

Also ich versuchs mal.
Der let-Block besteht hier aus 3 Teilen. Der erste Teil sagt, dass hi = 'hihi ist. Danach wird eine Funktion definiert. Diese Funktion heißt hi und hat einen Parameter hi. Die Funktion selbst liefert eine andere anonyme Funktion zurück. Diese hat nur einen Parameter hi und baut aus diesem Parameter ein Paar mit zweimal dem gleichen Element.
Das alles wird aber noch nicht ausgeführt, sondern zuerst kommt die letzte Zeile dran: (hi hi) ruft die Funktion hi mit Parameter hi auf. Dieser Parameter ist auch die Funktion hi. Dieser Parameter ist aber egal, weil der sowieso nicht weiter beachtet wird. Stattdessen wird eine neue Funktion zurückgegeben, nämlich (lambda (hi) (cons hi hi)). Würde man die letzte Zeile damit ersetzen stünde folgendes da: ( (lambda (hi) (cons hi hi)) 'hi)
Und das wird ausgewertet zu (cons 'hi 'hi) => (hi . hi)

Um es vielleicht noch etwas klarer zu machen, mal mit etwas anderen Namen:

(let ((hi5 ’hihi))
   (define (hi3 hi4)
       (lambda (hi2) (cons hi2 hi2)))
((hi3 hi3) ’hi))