2009-05-29 8 views
46

Ho trovato la parola "thunk" in molti punti del codice e della documentazione relativa a Scheme e territori simili. Sto indovinando che è un nome generico per una procedura, che ha una sola argomentazione formale. È corretto? Se sì, c'è dell'altro? Se no, per favore?Che cos'è un "thunk", come usato in Scheme o in generale?

Ad es. in SRFI 18, nella sezione "Procedure".

+1

possibile duplicato di [Che cos'è un 'thunk'?] (Http://stackoverflow.com/questions/2641489/what-is-a-thunk) – Stephan

risposta

56

È davvero semplice. Quando hai qualche calcolo, come aggiungere 3 a 5, nel tuo programma, quindi creare un thunk di esso significa non per calcolarlo direttamente, ma invece crea una funzione con argomenti zero che la calcola quando è necessario il valore reale.

(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 

Nel secondo caso, foo sarebbe stato chiamato un thunk.

I linguaggi pigri sfociano la linea tra l'associazione di una variabile a un valore e la creazione di una funzione per restituire tale valore, in modo che la scrittura di qualcosa come la prima sopra sia effettivamente trattata come la seconda, sotto il cofano.

+1

Lo schema non è una lingua pigra, giusto? (in 'Panoramica del regime' in r6rs). Quindi, se creo un pensiero, come sopra, creerà uno scenario di valutazione pigro? –

+1

^s/think/thunk/(mio male) –

+1

Per favore guarda il link kotlinski (http://stackoverflow.com/questions/925365/what-is-a-thunk-as-used-in-scheme-or- in generale/925373 n. 925373) fornito per come Scheme implementa uno schema di valutazione pigro. – Svante

12

Wikipedia ha la seguente risposta:

In programmazione funzionale, "thunk" è un altro nome per una funzione nullaria - una funzione che non accetta argomenti. I thunk sono frequentemente usati in linguaggi stretti come mezzo per simulare la valutazione pigra; il thunk stesso ritarda il calcolo dell'argomento di una funzione e la funzione forza il thunk per ottenere il valore effettivo. In questo contesto, un thunk viene spesso chiamato una sospensione o (in Scheme) una promessa.

Aggiunta di un lazy evaluation example in Scheme. Ecco, la promessa è un'altra parola per thunk.

+2

Grazie. Sto cercando qualcosa di meglio. Wikipedia non spiega cose e concetti che voglio davvero sapere. –

+1

@Amit - Presumo che abbiate commentato prima che la domanda venisse aggiornata con la citazione. Questa è la risposta esatta alla tua domanda. – tvanfosson

+1

@tvanfosson probablty è stato modificato dopo il post originale. @kotlinski sarà possibile dimostrarlo in qualche modo? –

33

Un "thunk" è un oggetto procedura senza argomenti formali, ad es. dal tuo link SRFI:

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

La variabile b1 è legata al blocco racchiude, e questo ci dà un indizio per l'etimologia della parola "thunk", che si basa su una battuta sulla grammatica poveri.

Una funzione di argomento zero non ha modo di modificare il suo comportamento in base ai parametri con cui è chiamato, poiché non ha parametri. Pertanto l'intera operazione della funzione è impostata - è solo in attesa di essere eseguita. Non è necessario più "pensiero" da parte del computer, tutto il "pensiero" è stato fatto - l'azione è completamente "thunk" attraverso.

Questo è tutto un "thunk" è nel contesto di questo SRFI - una procedura senza argomenti.

+5

Grazie per aver spiegato perché si chiama "thunk" – mynameistechno

Problemi correlati