la mise en œuvre de l'état de la machine à l'aide de la “rendement” mot-clé
Est-il possible d'utiliser le mot clé yield à mettre en œuvre une simple machine d'état comme illustré ici. Pour moi, cela ressemble à du compilateur C# qui a fait le travail dur pour vous comme il l'interne met en œuvre une machine d'état pour faire de l'instruction rendement de travail.
Pouvez-vous piggy-back sur le haut du plan de travail du compilateur est déjà fait et qu'il puisse mettre en œuvre la plupart de la machine d'état pour vous?
Quelqu'un a fait cela, est-il techniquement possible?
Vous devez vous connecter pour publier un commentaire.
C'est faisable, mais c'est une mauvaise idée. Itérateur blocs ont été créés pour vous aider à écrire personnalisé itérateurs pour les collections, pas pour la résolution de l'usage général problème de la mise en œuvre des machines à états.
Si vous voulez écrire une machine d'état, il suffit d'écrire une machine d'état. Il n'est pas difficile. Si vous souhaitez écrire beaucoup de machines d'état, écrire une bibliothèque de utile méthodes d'assistance qui vous permettent proprement représentent les machines d'état, et ensuite utiliser votre bibliothèque. Mais n'en abusez pas une structure du langage, destiné à quelque chose de complètement différent qui arrive juste à utiliser des machines d'état comme un détail d'implémentation. Qui permet à votre machine d'état code difficile à lire, de comprendre, de débogage, de maintenir et d'étendre.
(Et d'ailleurs, j'ai fait un double-take lors de la lecture de votre nom. L'un des concepteurs de C# est également nommé Matt Warren!)
RegEx
, trouve l'appariement de schémas d'entrée, pour l'essentiel, en l'utilisant comme quelque chose comme un DFA. Quelle est votre opinion à ce sujet?Oui, il est tout à fait possible et facile à faire. Vous pouvez profiter de l'aide de constructions de flux de contrôle (
for
,foreach
,while
, ...goto
(à l'aide degoto
convient en particulier de ce scénario ;))) avecyield
s pour construire un.ReadFromIOPort
est retardé, le port fermé de façon inattendue, ou le port est occupé à quelque chose d'autre? Si vous souhaitez définir un délai pour la réception de données? La nature cyclique de la machine doit être modifié pour supporter tout ce qui va mal.Alors que ce n'est pas une machine d'état dans le sens classique du terme, l'article sur Itérateur à base de Micro-Threading utilise rendement de façon créative pour les actions basées sur l'état.
Itérateur blocs ne peuvent en effet mettre en œuvre des machines à état, mais le problème est d'arriver à l'entrée suivante. Comment allez-vous savoir où aller ensuite? Je suppose que vous pourriez avoir une sorte de partage "la transition actuelle" variable, mais c'est un peu dégueulasse.
Si vous n'avez pas besoin d'entrée (par exemple, votre machine d'état est juste à vélo entre les états) ensuite c'est facile, mais ce n'est pas intéressant, genre 🙂
Pouvez-vous décrire le type de machine d'état qui vous intéresse?