2013-02-18 19 views
6

In uno schema che è un linguaggio di programmazione funzionale, non esiste un'istruzione di assegnazione. Ma in una dichiarazione letSchema let dichiarazione

(let ((x 2)) 
    (+ x 3)) 

si assegnano 2-x, quindi perché non fa questo viola il principio che non ci sono istruzioni di assegnazione in programmazione funzionale?

risposta

11

L'istruzione "Schema che è un linguaggio di programmazione funzionale" non è corretta. In Scheme, uno stile di programmazione funzionale è incoraggiato, ma non forzato. In realtà, è possibile utilizzare set! (un'istruzione di assegnazione!) Per modificare il valore di qualsiasi variabile:

(define x 10) 
(set! x (+ x 3)) 
x 
=> 13 

Per quanto riguarda la let dichiarazione della questione, si ricordi che un'espressione come questa:

(let ((x 10)) 
    (+ x 3)) 
=> 13 

... è solo zucchero sintattico, e sotto il cofano è implementato in questo modo:

((lambda (x) 
    (+ x 3)) 
10) 
=> 13 

si noti che un.210 esegui una tantum single assignments sulle sue variabili, in modo da non violare alcun principio programmazione puramente funzionale per sé, il seguente può affermare di un let espressione:

Una valutazione di un'espressione non ha un effetto collaterale se non cambia uno stato osservabile della macchina, e produce stessi valori per lo stesso ingresso

Inoltre, citando Wikipedia:

I linguaggi funzionali impuri forniscono sia un singolo compito sia un vero compito (sebbene il vero compito venga tipicamente usato con meno frequenza rispetto ai linguaggi di programmazione imperativi). Ad esempio, nello Schema, sia l'assegnazione singola (con let) e la vera assegnazione (con set!) può essere utilizzato su tutte le variabili, e primitive specializzati sono previste per l'aggiornamento distruttiva all'interno degli elenchi, vettori, stringhe, ecc

+1

A il linguaggio di programmazione funzionale incoraggia e offre funzionalità per ma non impone necessariamente la programmazione funzionale. – ThePiercingPrince