Sto cercando di capire l'iteratore. Noto Python documentation considera l'iteratore come un costrutto in stile funzionale. Non lo capisco davvero.Perché l'iteratore è considerato in stile funzionale nella documentazione di Python?
Non è vero che l'iteratore ha uno stato al suo interno. Quindi quando chiami it.__next__()
, muti lo stato dell'iteratore. Per quanto ne so, lo stato mutante di un oggetto non è considerato funzionale, dal momento che la programmazione funzionale enfatizza l'immutabilità e la capacità compositiva dell'oggetto/chiusura.
In realtà, il problema si presenta perché voglio scrivere una procedura/funzione Schema che richiede token e restituisce un iteratore.
(define tokens->iterator
(lambda ls
(lambda()
(if (null? ls)
'*eoi*
(let ((tok (car ls)))
(set! ls (cdr ls))
tok)))))
Avviso devo usare set!
di mutare ls
, è così che si presenta con questa domanda.
Per usarlo,
(define it (tokens->iterator 1 '+ 2))
Per provarlo,
[email protected](guile-user)> (it)
$2 = 1
[email protected](guile-user)> (it)
$3 = +
[email protected](guile-user)> (it)
$4 = 2
[email protected](guile-user)> (it)
$5 = *eoi*
[email protected](guile-user)> (it)
$6 = *eoi*
Solo per divertimento, ho anche traduco questo per Python:
def tokens_to_iterator(*tup):
ls = list(tup)
def iterator():
if not ls:
return "*eoi*"
else:
tok = ls.pop(0)
return tok
return iterator
Allo stesso modo, il il metodo pop() rimuove e restituisce il primo elemento mediante la mutazione la lista.
Per usarlo,
it = tokens_to_iterator(1, "+", 2)
per testarlo,
>>> it()
1
>>> it()
'+'
>>> it()
2
>>> it()
'*eoi*'
>>> it()
'*eoi*'
chiunque può chiarire su questo? A proposito, sto usando Python 3 e Guile Scheme nel caso qualcuno sia interessato a provare gli esempi.
"Funzionale" e "senza stato mutabile" non sono la stessa cosa. – zwol
perché questo stato è nascosto all'interno e inaccessibile dall'esterno; è * incapsulato *. Cambia automaticamente su ogni * prossima * chiamata e la validità dell'oggetto viene preservata. Dal punto di vista dell'osservatore esterno, si comporta secondo alcune * leggi *, è * coerente * e questo non può essere modificato arbitrariamente dall'esterno. questo stato è solo un dettaglio implementativo. –
@zwol C'è anche "senza effetti collaterali". È lo stesso di "mutable-state-free"? Perché "Functional" e "mutable-state-free" non sono la stessa cosa? L'enfasi del linguaggio "funzionale" non è su "mutable-state-free"? Mi sto perdendo sth qui? –