miércoles, enero 10, 2007

Otra libra de carne

... un momento, ¡esto suena a rock!
Reverendo Lovejoy
Cossette friega los suelos para saldar su deuda con la Seguridad SocialLas SS españolas, es decir, las seguridades sociales, que aunque son una, merecen el plural mayestático, son una fuente inagotable de sorpresa y regocijo... para quien sepa tomarse estas cosas con filosofía.
Esta vez, mis azares y aventuras me han conducido a las oficinas de las SS para solicitar una "vida laboral". Esto es, una especie de certificado de buena conducta que, a pesar de encontrarnos en pleno siglo XXI, ese monstruo llamado Estado es incapaz de transmitir vía electrónica entre dos de sus ministerios (alegrémonos de ello). De modo que me he personado en el antro que corresponde a mi quartier a las 12:00 del mediodía... y me encontrado a los funcionarios con los brazos cruzados, charlando amigablemente entre ellos. ¿Una vida laboral, majete? De lunes a jueves, pero solamente entre las nueve y las once de la mañana, que es la hora en la que Saturno cruza por las antífonas del ascendente menor disminuido de Júpiter Olímpico. ¡Por el amor de Baco! ¡Santa Madre de Dionisos!
Como soy un individuo que, muy en el fondo, aún conservo algo de fe en la especie humana, cuando consiga el dichoso certificado de sangre que me acredite como cristiano viejo, les diré que me siento como Jean Valjean. Espero que esta vez sepan quién es Jean Valjean, la pequeña Cossette y el inspector Javert. ¡Tantas veces que la han pasado por la tele!

Etiquetas:

viernes, enero 05, 2007

Koan de los dos hermanos

¿Yang y yin?Si en el Universo sólo existiesen dos hermanos, ¿cuáles serían sus nombres?

Etiquetas:

Inicializadores de colecciones

Collection initializers: a new feature in C# 3.0Junto con los inicializadores de objetos, C# 3.0 introduce inicializadores de colecciones, para simplificar la inicialización de objetos cuyas clases implementen la interfaz genérica ICollection<T>.
Suponga que estamos trabajando con C# 2.0, y que queremos crear una lista genérica de enteros y añadirle unos cuantos elementos iniciales:
List<int> lista =
new List<int>(new int[] { 1, 2, 3, 4 });
El ejemplo anterior utiliza uno de los constructores de la clase List, que recibe un parámetro de tipo IEnumerable, en su versión genérica. El CLR considera que todo vector implementa dicha interfaz, por lo que el compilador genera instrucciones para crear el vector para luego pasarlo al constructor de List.
¿Se da cuenta de lo ineficiente que es esta técnica? Observe el código aproximado que debe generar el compilador, con sintaxis C# para no hacerlo ilegible:
int[] temp = new int[4];
temp[0] = 1;
temp[1] = 2;
temp[2] = 3;
temp[3] = 4;
List<int> lista = new List<int>(temp);
Pero esto es sólo lo que ocurre a la vista de todos. Recuerde que el parámetro recibido por el constructor es una interfaz IEnumerable. El constructor debe ejecutar el método GetEnumerator de la referencia recibida, y llamar al método MoveNext repetidas veces sobre el resultado de la llamada.
Bienvenidos a C# 3.0. Ahora podemos usar esta sintaxis:
List<int> lista =
new List<int>(){ 1, 2, 3, 4 };
Los cambios son sutiles, pero importantes. Ahora utilizamos el constructor sin parámetros de List, aunque tenemos la libertad de usar el constructor que mejor nos parezca, pues la lista de elementos iniciales no se pasa como parámetro del constructor. Por el contrario, la lista se yuxtapone tras el paréntesis de cierre de la lista de parámetros. Aunque parece un vector literal, no lo es: no hay indicación del tipo de los elementos... porque exigiremos que sean compatibles con el tipo de elemento de la lista. La traducción es la siguiente:
List<int> lista = new List<int>(temp);
lista.Add(1);
lista.Add(2);
lista.Add(3);
lista.Add(4);
Ya no tenemos que crear e inicializar un vector de usar y tirar. Ya no hay un bucle dentro del constructor. Ya no se crea una instancia temporal de IEnumerator para el bucle del constructor. De manera que no sólo ahorramos tiempo, de manera directa, sino que también ahorramos memoria, y aliviamos la carga del garbage collector.
Sólo nos queda un detalle por aclarar. Las llamadas al método Add tienen en realidad este aspecto:
((ICollection<int>)lista).Add(1);
Pero esto no significa una carga adicional, porque la conversión anterior no genera código adicional... al menos en lenguaje intermedio. Tengo que comprobar todavía lo que ocurre cuando se traduce a código nativo.
Como imaginará, cuento todo esto porque acabo de añadir a Freya estos inicializadores de colecciones. Eso sí, la sintaxis provisional es "fea":
List[Integer] := new List[Integer]![1,2,3,4];
No podemos yuxtaponer sin más el inicializador a la expresión new, porque Freya permite omitir los paréntesis cuando no hay parámetros, y porque usamos los corchetes para los parámetros de tipos genéricos. No podemos usar ninguno de los operadores permitidos en expresiones, porque introduciríamos ambigüedad en el lenguaje. He probado el uso de la asignación de Pascal, y aunque no causa problemas, el efecto estético es horroroso. Me he quedado con el signo de admiración porque me ha parecido el menor de los males.

Etiquetas: ,

miércoles, enero 03, 2007

A Pound of Flesh

... and Justice for AllAcabo de poner en práctica un experimento que me ha revelado un hecho sorprendente: ¡en la Seguridad Social (SS en lo sucesivo) no conocen a Shakespeare! No es que no sepan qué es El Mercader de Venecia, desgraciada obra antisemita que desmerece el genio del Bardo de Avon, o incluso que no conozcan a Jeremy Irons y Al Pacino: el propio Shakespeare les suena a nombre de inmigrante chino.
Y no se trata de un experimento efectuado sobre un único y pobre desgraciado elegido al azar por un experimentador chiflado que se cree Dios: le he dicho a la funcionaria que me atendió que quería pagar mi libra de carne y cuando, tras torcer el gesto y regañarme, ha confesado desconocer de qué iba la historia, me he tomado el atrevimiento (y la molestia) de ir buró por buró (sitio donde se enquistan los burócratas de la SS española) preguntando a sus nueve compañeros si tenían alguna idea de lo que significaba una libra de carne. Unánime negativa. Incluso he preguntado si lo negaban por fastidiarme. Desconcierto y sorpresa.
Lo peor de todo, o lo mejor, según como se mire, es lo que me ocurrió al despedirme: la personita, ofendida en lo más profundo de su alma logseana, me espetó:
- ¡Nadie que venga con una Biblia en la mano tiene derecho a echarme un sermón!
Abrí los ojos como platos, hasta que comprendí a qué se refería. Entonces levante la mano con la que sostenía el libro, y le enseñé la portada de mi ejemplar encuadernado en piel de las "Lectures on Quantum Mechanics", de Paul Adrien Maurice Dirac, que yo, ateo budista, había llevado para aliviar mi espera en la larga cola de suplicantes.
Post scriptum: El incidente, en sí, es más grotesco que terrible. Tampoco pretendo que se obligue a leer a Shakespeare en la escuela pública, ni a Dirac, ni siquiera la Biblia. Lo terrible es que gente así se atribuya constantemente el poder de decidir por todos nosotros.

Etiquetas: