2009-05-29 5 views
46

Ich finde das Wort "Thunk" an vielen Stellen in Code und Dokumentation im Zusammenhang mit Scheme und ähnlichen Gebieten. Ich vermute, dass es sich um einen generischen Namen für eine Prozedur handelt, die ein einziges formales Argument hat. Ist das korrekt? Wenn ja, gibt es mehr dazu? Wenn nein, bitte?Was ist ein "Thunk", wie in Schema oder allgemein verwendet?

Für z. in SRFI 18, im Abschnitt "Verfahren".

+1

mögliche Duplikate von [Was ist ein 'Thunk'?] (Http://stackoverflow.com/questions/2641489/what-is-a-thunk) – Stephan

Antwort

56

Es ist wirklich einfach. Wenn Sie etwas Berechnung, wie Hinzufügen von 3 bis 5, in Ihrem Programm haben, bedeutet das Erstellen eines Thunk davon nicht, um es direkt zu berechnen, sondern erstellen Sie stattdessen eine Funktion mit null Argumente, die es berechnen, wenn der tatsächliche Wert benötigt wird.

(let ((foo (+ 3 5))) ; the calculation is performed directly, foo is 8 
    ;; some other things 
    (display foo)) ; foo is evaluated to 8 and printed 

(let ((foo (lambda() (+ 3 5)))) ; the calculation is delayed, foo is a 
           ; function that will perform it when needed 
    ;; some other things 
    (display (foo))) ; foo is evaluated as a function, returns 8 which is printed 

Im zweiten Fall foo wäre ein Thunk aufgerufen werden.

Lazy Sprachen verwischen die Grenze zwischen dem Binden einer Variablen an einen Wert und dem Erstellen einer Funktion, um diesen Wert zurückzugeben, so dass das Schreiben von etwas wie dem ersten Formular tatsächlich wie das zweite unter der Haube behandelt wird.

+1

Scheme ist keine faule Sprache, oder? (in 'Überblick über das Schema' in R6rs). Also, wenn ich ein Denken, wie oben, erstellen, wird es ein faules Bewertungsszenario schaffen? –

+1

^s/think/thunk/(mein Schlechter) –

+1

Bitte schauen Sie auf den Link Kotlinski (http://Stackoverflow.com/questions/925365/what-is-a-thunk-as-used-in-scheme-oder-) general/925373 # 925373), wie Scheme ein Lazy-Evaluierungsschema implementiert. – Svante

12

Wikipedia folgende Antwort hat:

In der funktionalen Programmierung "Thunk" ist ein anderer Name für eine nullary Funktion - eine Funktion, die keine Argumente übernimmt. Thunks werden häufig in strengen Sprachen verwendet, um eine faule Bewertung zu simulieren; Das Thunk selbst verzögert die Berechnung des Arguments einer Funktion, und die Funktion zwingt das Thunk, den tatsächlichen Wert zu erhalten. In diesem Zusammenhang wird ein Thunk oft als Suspension oder (in Schema) als Versprechen bezeichnet.

Hinzufügen einer lazy evaluation example in Scheme. Hier ist Versprechen ein anderes Wort für thunk.

+2

Vielen Dank. Ich suche nach etwas Besserem. Wikipedia erklärt keine Dinge und Konzepte, die ich wirklich wissen möchte. –

+1

@Amit - Ich nehme an, Sie haben kommentiert, bevor die Frage mit dem Zitat aktualisiert wurde. Dies ist die genaue Antwort auf Ihre Frage. – tvanfosson

+1

@tvanfosson Probablilty wurde nach dem ursprünglichen Beitrag bearbeitet. @kotlinski wird es möglich sein, es irgendwie zu demonstrieren? –

33

Ein "Thunk" ist ein Prozedurobjekt ohne formale Argumente, z. von Ihrem SRFI Link:

(lambda() (write '(b1))) 

Das b1 Variable wird in dem umschließenden Block gebunden ist, und das gibt uns einen Hinweis auf die Etymologie des Wortes „Thunk“, die auf einem Witz über schlechte Grammatik beruht.

Eine Zero-Argument-Funktion hat keine Möglichkeit, ihr Verhalten basierend auf Parametern, mit denen sie aufgerufen wird, zu ändern, da sie keine Parameter enthält. Daher ist die gesamte Operation der Funktion eingestellt - sie wartet nur darauf ausgeführt zu werden. Kein "Nachdenken" ist seitens des Computers mehr nötig, alles "Denken" ist erledigt - die Aktion ist komplett "durchgeknallt".

Das ist alles ein "Thunk" ist in diesem SRFI-Kontext - eine Prozedur ohne Argumente.

+5

Danke für die Erklärung, warum es ein "Thunk" genannt wird – mynameistechno