Je voudrais écrire quelque chose comme ceci:
(define switch
((lambda (state)
(lambda()
(begin
(set! state (not state))
state)))
#f))
qui peut être invoqué comme ceci:
> (switch)
#t
> (switch)
#f
> (switch)
#t
Une petite explication: le lambda externe est une fonction qui prend un état initial et retourne un autre fonction qui retourne cet état d'avant en arrière à chaque invocation. Notez que la fonction externe est invoquée immédiatement avec le #f
sur la dernière ligne; Le commutateur est alors défini comme le résultat de cette invocation, la fonction interne capturant state
dans une fermeture.
Vous pouvez aussi écrire quelque chose comme ceci:
(define make-switch
(lambda()
((lambda (state)
(lambda()
(begin
(set! state (not state))
state)))
#f)))
make-switch
prend ce que nous avions avant et l'enveloppe dans une autre fonction. Maintenant, ce que nous avons est une usine pour faire des commutateurs, chacun avec leur propre état interne. Nous pouvons donc écrire quelque chose comme ceci:
(define switch-a (make-switch))
(define switch-b (make-switch))
Et voir que chaque commutateur est indépendant de l'autre:
> (switch-a)
#t
> (switch-b)
#t
> (switch-b)
#f
> (switch-a)
#f
De même vous pourriez paramétrez make-switch
pour définir l'état initial du commutateur, et ainsi sur.
Espérons que cela aide.
L'idée de «non-mutations» est que les fonctions ne devraient jamais modifier quelque chose en dehors de lui-même. De cette façon, vous pouvez exécuter des fonctions sans vous soucier de savoir si elles auront des effets étranges sur le reste du programme. – erjiang
Je comprends le paradigme fonctionnel (même si je ne suis pas sûr d'être prêt à y adhérer), «Jamais» n'est aussi strict. Parfois, ne pensez-vous pas secrètement, "ooh, avoir un souvenir de l'occurrence d'un événement serait tellement agréable." Tout logiciel interactif doit garder une trace des interactions - doit garder des souvenirs de certains événements/paramètres. – Tim