Czy pattern maching to regexp 2.0? W sensie brzydki i ciężko coś wydzielać? Alternatywą jest chyba tylko drabina ifów które będą o wiele bardziej rozwlekłe i przez to gorzej czytelne?
Mój przypadek dotyczy Haskella ale pewnie można to spotkać w każdym języku który gdzie jest pattern matching. Mam sobie kod:
peepholeOptimize2 :: InstructionList -> InstructionList
peepholeOptimize2 (IAL (SPure (Cons c)) : IAL (SPure (Indexed (IImmediate i) Move)) : ICF (Labeled LTop (Branch t)) : il) = optimizeBranchCondition i t c <> peepholeOptimize2 il
peepholeOptimize2 (i : il) = i : peepholeOptimize2 il
peepholeOptimize2 [] = []
Na pytanie czemu to takie brzydkie odpowiadam: to wiem właśnie to chciałym rozwiazać.
Na pytanie czemu to wygląda jak assembler tylko poziomo - bo to jest fragment optymalizatora mojego ezoterycznego asemblera dla maszyny stosowej. Chodzi o to żeby w programie napisanym w esoasemblerze wyłapać fragment
pushConst *const* # liczba do przetestowania
moveImediate *index* # ładuje wartość labele gdzie skoczyć na szczyt stosu (tak, labele są liczbami naturalnymi jak w basicu, ale można na nich jeszcze robić obliczenia artymetyczne :D )
branch *testCondition* # jak EZ (Equals Zero) lub LTN (Less Then Zero)
na skok kezwarunkowy lub brak skoku w zalezności od tego co uda się wyliczyć podczas optymalizacji
Reszta funkcji odpowiada za żeby wywołać się rekurencyjnie dla kolejnych przypadków lub zwrócić pustą listę dla końca listy instruckji.
Aktulanie to jest mój najdłuższyb przypadek, ale czuję że będą dłuższe :D Pytanie czy macie jakies pomysły co można z tym zrobić? Czy ktoś z was pisał kod gdzie matchowało się 3, 4, 5 elementów listy?
UPDATE w Scali wiem jakie by mogło być rozwiązanie, np trzymać to jako PartialFunction. Ale nawet jeśli można w scali to czy to dobre rozwiązanie?