Re: tutorial findString
Manuel Blanc <[email protected]>
| Newsgroups | gmane.education.small-land |
|---|---|
| Message-ID | <[email protected]> |
On 15 Aug 2004, at 5:26 PM, Diego Gomez Deck wrote: [Esteban escribió:] >> De todas las interesantes respuestas que he leído, me gusta >> especialmente ésta: >> >> --- Diego Gomez Deck wrote: >>> >>> ¿Qué es lo que hace falta que el Squeak haga? >>> >> Llevo muy poco tiempo con Squeak y me gusta. Sin embargo, se nota muy >> orientado a problemas de 'tipo ingeniero'. La mayoría de los guiones >> prediseñados son 'avanza', 'rota', 'multiplica', etc. Pero creo que >> hay mucha gente interesada en aplicaciones sobre lenguaje natural. En >> concreto, mi carta a los reyes magos, consistiría en lo siguiente: >> >> 1.Un guión en la categoría texto para buscar una cadena de caracteres >> en un texto. > > Esto es bastante fácil de hacer. Lo que me gustaría, antes de > hacerlo, es que hagamos una pequeña carta a los reyes de que tipo de > procesamiento de cadenas necesitamos (además, claro, del findString). > > Una primera lista que puede servir como inicio para la discusión > puede ser: > > - contains (contiene): si el texto contiene otro texto. > > - containsWord: (buscar palabra) que buscaría Platón y no daría > verdadero cuando esté la palabra "Platona". > > - startsWith (empieza con) > > - endsWith (termina con) > > - asUpperCase (como mayúsculas): devuelve una cadena pero con todos > los caracteres en mayúsculas. Esto es útil para usar en combinación > con las opciones de búsqueda, para que se encuentre con cualquier > combinación de mayúsculas minúsculas. Ejemplo: > > texto asUpperCase startsWith: 'HABÍA UNA VEZ' > > En ese ejemplo, cualquier cadena que comience con 'había una vez' o > 'HaBÍa uNa Vez' o 'HABÍA UNA VEZ' daría "verdadero". > > - asLowerCase (como minúsculas): idem al anterior, pero al revés. > > La otra opción, para evitar que tener que concatenar 2 opciones, es > duplicar las funciones de búsqueda y hacerlas todas duplicadas (una > que busque respetando mayúsculas/minúsculas y la otra que ignore esas > diferencias). Ejm: endsWith y endsWithIgnoringCase, containsWord y > containsWordIgnoringCase, etc. > > - match (coincide): Esta función permitiría comparaciones con > caracteres 'comodín' (como el * del viejo DOS). Ejemplos de uso: > > '*pepe*' match: 'pepe' --> verdadero > '*pepe*' match: 'pepa' --> false > '*pepe*' match: 'xxx pepe yyy' --> verdadero > 'pepe*' match: 'xxx pepe' --> false > 'pepe*pepa' match: 'pepe ama a pepa' --> verdadero > > Esta última es interesante porque incluye a varias de las anteriores, > ejemplo: > > 'pepe*' match: algo >>equivale a>> algo startsWidth: 'pepe'. > '*pepe' match: algo >>equivale a>> algo endsWidth: 'pepe'. > '*pepe*' match: algo >>equivale a>> algo contains: 'pepe'. > > Comentarios? > > > Obsérvese que findString da positivo cuando encuentra > 'Platón' y cuando encuentra 'Platona', lo que ¿quizás? es fácil de > mejorar. > Yo creo que con match: bastaría si se hiciera de la siguiente forma: - Si no hay asteriscos presentes entonces funcionaría como containsWord: - con asteriscos a ambos lados funcionaría como contains: - con asterisco al principio o al final funcionaria como endsWith: y startsWith: respectivamente. Para hacer un "match" exacto eToys ya proporciona el metodo = (cosa que esteban ya había descubierto) Con respecto a las mayusculas y minusculas, yo sugiero que se distinga siempre entre ellas. [Nota técnica: si se necesitan ampliaciones en el futuro siempre se pueden conseguir mejorando el lenguage de expresiones regulares (ej '[Pp]ep[ea]' match: algo, reconoceria 'pepe', 'pepa', 'Pepe' y 'Pepa', pero no 'pepi') en vez de añadiendo más métodos "asustantes" a eToys] >> 2.Más efectos lógicos: me explico. Una "prueba" en un guión >> corresponde a lo que en lenguaje natural llamamos un condicional: >> >> si encuentra la palabra clave 'Platón' muestra en la salida el texto >> correspondiente >> >> Sin embargo, ¿hay una forma tan eficiente para activar un evento >> cuando ocurra una conjunción de objetivos, por ejemplo, encuentre >> "Platón" y "ética" ? > > Esto lo podés hacer hoy, anidando cajas de prueba. > >> ¿Existe una forma tan eficiente para activar un evento cuando ocurra >> una disyunción de objetivos, por ejemplo "Platón" o "ética"? > > Esto se lograría con una caja de prueba detrás de otra caja de prueba. Yo sugeriría encontrar una forma alternativa que fuera menos engorrosa cuando el problema sea real y no un mero ejemplo. [Nota técnica: estoy pensando un morfo "analizador lexicográfico dirigido por tabla de mosaicos". A pesar del nombrecito seria muy fácil de usar simplemente moviendo mosaicos a una tabla. Además tambien podría ser de aplicación a morfos más gráficos. ¿Es razonable, Diego?]. Si hay interés, elaboro más la idea. Saludos --Manolón