Próbuję zrozumieć iterator. Zauważam, że Python documentation uważa iterator za konstrukcję w stylu funkcjonalnym. Naprawdę tego nie rozumiem.Dlaczego iterator jest uważany za funkcjonalny w dokumentacji Pythona?
Czy to prawda, że iterator ma w sobie stan. Więc kiedy wywołasz it.__next__()
, mutujesz stan iteratora. O ile mi wiadomo, mutowanie stanu obiektu nie jest uważane za funkcjonalne, ponieważ programowanie funkcjonalne kładzie nacisk na niezmienność i komponowanie obiektu/zamknięcia.
W rzeczywistości pojawia się problem, ponieważ chcę napisać procedurę/funkcję schematu, która pobiera tokeny i zwraca iterator.
(define tokens->iterator
(lambda ls
(lambda()
(if (null? ls)
'*eoi*
(let ((tok (car ls)))
(set! ls (cdr ls))
tok)))))
Wskazówka muszę używać set!
mutować ls
, to w jaki sposób podchodzi się z tym pytaniem.
Aby go użyć,
(define it (tokens->iterator 1 '+ 2))
By to sprawdzić
[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*
Tak dla zabawy, ja też przetłumaczyć to 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
Podobnie, Metoda pop() usuwa i zwraca pierwszy element poprzez mutację Lista.
Aby go użyć,
it = tokens_to_iterator(1, "+", 2)
By to sprawdzić
>>> it()
1
>>> it()
'+'
>>> it()
2
>>> it()
'*eoi*'
>>> it()
'*eoi*'
Może ktoś wyjaśnić w tej sprawie? Przy okazji, używam Pythona 3 i Schematu Guile na wypadek, gdyby ktoś był zainteresowany wypróbowaniem przykładów.
"Funkcjonalny" i "bez możliwości zmiany stanu" to nie to samo. – zwol
ponieważ ten stan jest ukryty w środku i niedostępny z zewnątrz; jest * enkapsulowany *. Zmienia się automatycznie przy każdym kolejnym połączeniu *, a ważność obiektu zostaje zachowana. Z punktu widzenia obserwatora zewnętrznego zachowuje się on zgodnie z niektórymi * prawami *, jest * zgodny * i nie może być dowolnie zmieniany z zewnątrz. ten stan jest tylko szczegółem implementacji. –
@zwol Istnieje również "bez efektów ubocznych". Czy to jest to samo, co "bez mutacji"? Dlaczego "Funkcjonalny" i "niestabilny stan" nie są takie same? Czy nie wszystkie "funkcjonalne" naciski językowe na "niestabilny stan-wolny"? Czy tu brakuje mi czegoś? –