Encaixar patrons

De Viquipèdia
Dreceres ràpides: navegació, cerca

En Tecnologies de la informació, encaixar patrons (en anglès:pattern matching) és l'operació de comprovar si una dada pot ser descomposada a partir de les operacions especificades en una expressió patró, obtenint-ne els components constitutius i assignant-los a les variables especificades al patró, cas de patrons d'expressions algebraiques o obtingudes com a resultat en cas d'expressions regulars en forma de llista de seccions delimitades per parèntesis.

Patrons algebraics [modifica]

S'utilitzen molt en llenguatges de programació funcional.

Per exemple, si tenim una dada cadena 'abc' i el patró és x.'c' (x seguit de 'c') la comprovació tindrà èxit i s'assignarà a la variable x el valor 'ab'.

Normalment se sol especificar una llista de patrons possibles i les accions a prendre en cada cas.

Cas de llistes i llenguatge Haskell:

[]             identifica la llista buida
(x:xs)       expressa la composició a partir d'un element i una altra llista

La descomposició per comprovació de patrons es pot completar amb guardes per especificar accions a fer en subdominis de valors.

(x:xs) | x<5 ...
| altrament ...

En llenguatge Scala podem afegir comprovació de tipus en els patrons

x:String ...
x:Int ...

Els valors individuals també poden ser especificats com a patrons

0 ...
1 ...
n ...

Expressions regulars [modifica]

Els patrons d'expressions regulars permeten descomposar un text i seleccionar subseqüències marcades entre parèntesi, obtenint com a resultat la llista de frases dites grups corresponents a les zones delimitades, que poden aplicar-se posteriorment a una substitució afegint un patró de substitució amb \1 \n o $1 $n marcant els llocs on incloure els grups obtinguts.

Hi ha llenguatges que incorporen aquests patrons amb tipus propis com ara Javascript

rexp = /a(b?c*)d(e?[a-c]{1,5}g)h/ ;
x = tira.replace(rexp, "..$1..$2..") ;

i els que no ho fan els construeixen a partir de cadenes de text i proporcionen biblioteques de rutines específiques per a aquest propòsit.

rexp = "a(b?c*)d(e?[a-c]{1,5}g)h" ;