sábado, diciembre 23, 2006

¡Feliz Navidad!

... para ser sincero, no soy muy fan de las Navidades. Pero ahora que es políticamente incorrecto hablar de Navidades en según qué ministerios, sería una pena desaprovechar una oportunidad para dar un poco por saco.
Lo dicho: Feliz Navidad, Bon Nadal, Zorionak, Merry Christmas, Joyeux Noël, etc, etc, y aunque un poco tarde, feliz Hanukkah.
(he pasado del Kwanza, como podéis ver...)

jueves, diciembre 21, 2006

Métodos anónimos

Voy a ocuparme un poco del compilador de Freya, ahora que baja la carga de trabajo por fin de año. Quiero terminar de implementar el soporte de métodos genéricos, introducir la inferencia de tipos para argumentos genéricos en llamadas a métodos genéricos, y probablemente de los primeros pasos para implementar métodos anónimos.
Con estos últimos, voy a saltarme una versión, y los voy a implementar desde el principio como las expresiones lambda de C# 3.0:
var L: List[Integer] := [1, 2, 3, 4];
if L.Exists(x => x mod 2 = 0) then
Console.WriteLine('Pares en la lista');
La sintaxis del ejemplo (la porción resaltada en rojo) es la del caso más simple: un método anónimo que devuelve un valor calculado con una expresión, que recibe un solo parámetro, y que el tipo de dicho es parámetro es inferible a partir del contexto.
El problema consiste en qué hacer en el caso más general: en C#, gracias a su sintaxis espartana, la versión completa de un método anónimo es aceptable. En un lenguaje pascaloide (o "algoloide"), es otra cosa. Esto sería una expresión en C#:
delegate(int x) { return x % 2 == 0; }
Y esto sería el equivalente literal en Freya:
method(x: integer) begin result := x mod 2 = 0 end
Si no ve dónde está el problema, recuerde que estas "expresiones" pueden usarse ahora como parámetros en llamadas a métodos.
En realidad, hay otro problema por el que le estoy dando tantas vueltas a la sintaxis. Me gustaría poder plasmar la idea de método anónimo = extensión de estructuras de control. Las listas genéricas en .NET tienen un método ForEach, un iterador cerrado, que acepta un parámetro de tipo delegado:
lista.ForEach(x => Console.WriteLine(x));
En este caso, C# ha considerado que la llamada a WriteLine se puede considerar, en el sentido más laxo, una función que no devuelve nada. Por lo tanto, permite eliminar las llaves que de otro modo deberían encerrar el bloque de instrucciones.
A mí me gustaría que Freya pudiera hacer esto (olvide por un momento el uso incorrecto de las palabras reservadas):
with x apply lista.ForEach do Console.WriteLine(x);
Esto es: me gustaría disponer de una instrucción de control "comodín" que pudiese simplificar el uso de métodos anónimos como parámetros de métodos... siempre que se cumpliesen algunas condiciones, como que el método sólo admitiese un parámetro de tipo delegado. Claro: esto no tendría sentido con una llamada al método Exists que mostré en el primer ejemplo, pues este método debe devolver un valor.
¿Tendría sentido una instrucción como la que imagino? ¿Tendría aplicación más allá de su evidente utilidad con iteradores cerrados? Teniendo en cuenta que ya Freya cuenta con un mecanismo útil y eficiente de iteradores abiertos, si sólo valiese para iteradores cerrados, no creo que mereciese la pena: es incluso probable que fuese mejor adaptar la sintaxis del foreach de C# para estos casos. Por último, ¿podría utilizarse una instrucción de este tipo para simplificar la conexión de manejadores anónimos a eventos? Esto es C# 2.0:
button1.Click += delegate { Console.WriteLine("Click"); };
¿No sería preferible algo así en Freya?
when button1.Click do Console.WriteLine('Click');
¡Ojo! No estoy convencido de que sea buena idea: sólo pregunto. No me gustaría añadir dos instrucciones diferentes para estos dos casos... pero tampoco estoy seguro de poder unificarlos.

Etiquetas:

martes, diciembre 19, 2006

Píldoras sobre el método Equals

Hay un par de píldoras nuevas, ambas relacionadas con el método virtual Equals:
Son trucos sencillos, casi de manual, pero es bueno recordarlos.

viernes, diciembre 15, 2006

El Problema de la Física

Espero que nadie se tome a mal que recomiende un libro de divulgación sobre Física, pero creo que The Trouble with Physics merece ser leído. Su autor es Lee Smolin, físico teórico, especialista, entre otras cosas, en gravedad cuántica.
El libro explica el atolladero en que se ha metido la Física teórica con la aclamada teoría de las cuerdas. En esta teoría, las partículas elementales se representan como entidades de una sola dimensión que habitan dentro de un mundo con diez, once o incluso veintiseis dimensiones. Precisamente, la necesidad de añadir tantas dimensiones siempre me pareció un desvío en el camino a una explicación más profunda de la Física. Antes de pasar por la universidad, mi interés principal era la Física, que aprendía a mi aire, de manera autodidáctica. En algún momento, llegué a la conclusión por cuenta propia que, para añadir la gravedad al esquema cuántico, era necesario un formalismo matemático en el que el número de dimensiones no viniese dado de antemano, y se me ocurrió buscar en la Informática la preparación que necesitaba para ello. Por eso estudié Informática y no Física... y me equivoqué, por supuesto, de profesión. Luego la teoría de las cuerdas fue haciéndose más y más popular. Me consolé pensando que, en definitiva, mi idea era sólo la intuición de un aficionado, y que si el Universo se explicaba mejor mediante cuerdas, ¿qué se le iba a hacer?
Desde entonces, la teoría de las cuerdas se ha ampliado y se ha retocado... pero sigue sin haber una prueba experimental de la misma. Más bien, se da una situación muy extraña: un experimento refuta una predicción de la teoría, pero hay abundancia de parámetros en la misma. Alguien mueve un poco los diales... y paf, nueva versión de la teoría que pasa la criba, aunque sin aportar nada nuevo. Como resultado, han empezado a oírse voces disidentes, como la de Roger Penrose, cuyo libro The Road to Reality recomiendo sin reservas.
En "The Trouble with Physics", Smolin presenta también algunas alternativas para la fusión entre Relatividad General y Mecánica Cuántica, entre ellas las spin networks y la loop quantum gravity.

jueves, diciembre 14, 2006

Intuitive C#: entrega 14/12/06

Hay una nueva versión de Intuitive C#:
El material existente se ha dividido en capítulos tentativos, y hay capítulos nuevos sobre Estructuras y Reflexión. Lea la sección Estado actual en el prólogo del libro para detalles sobre lo que haya de nuevo en cada entrega, los problemas detectados y planes a corto plazo.

domingo, diciembre 10, 2006

Intuitive C#

Intuitive C#... y ahora, hablemos un poco sobre planes. Estoy de racha como "escritor", y quiero aprovecharlo. Voy a aprovechar el impulso del manual sobre el lenguaje para reorganizarlo, ampliarlo y corregirlo, para convertirlo en un libro "de verdad", que se llamaría Intuitive C#, siguiendo la línea de Intuitive Delphi.
De hecho, ya he comenzado, dividiendo el contenido del manual en capítulos y trasvasando material escrito para la idea original del libro a este nuevo esqueleto. El libro comenzaría por una presentación general del CLR. El segundo capítulo, que sería nuevo, se titularía "Programación orientada a objetos", y describiría las ideas básicas relacionadas con el trío clásico: encapsulamiento, herencia y polimorfismo. Tercer capítulo: clases y objetos, en los que ya se verían detalles concretos de los tipos de clase en C#. Cuarto capítulo: estructuras; probablemente aproveche para presentar los tipos enumerativos en ese capítulo. Quinto: componentes. Esto es: propiedades, delegados y eventos. Habría un capítulo sobre administración de memoria, y de ahí en adelante la línea sería la del manual actual.
Es bastante trabajo, por lo que quiero mantener siempre una "versión estable" del libro, actualizada periódicamente. Quiero decir: una versión legible y coherente. No tiene sentido proponerse grandes metas y después tardar un año en tener resultados presentbles. Esta idea de libro sobre el lenguaje no es la idea "perfecta" que me gustaría poner por escrito, pero me he dado cuenta que hace falta algo en esta línea para motivar a la gente. Lo que sí aprovecharé son las cosas que he aprendido sobre el CLR gracias a Freya, para mostrar detalles de implementación en todo sitio donde sea posible. Si sale con barba, ya sabe...

[12/dic] Para la siguiente entrega ya hay un capítulo completo sobre estructuras, interfaces implementadas por estructuras y boxing. Ya está listo también un pequeño capítulo sobre reflexión, System.Type, y atributos.
Por cierto, ahí van dos detalles poco conocidos sobre el CLR:
  • ¿Sabía usted que el CLR permite definir procedimientos globales? Sí, he dicho bien: procedimientos, sin clases que los encapsulen, como en el viejo Pascal o en C. Claro, esto se utiliza para las extensiones de Visual C++.
  • La otra sorpresa oculta: CLR permite, en teoría, que los argumentos de tipos genéricos se comporten covariante o contravariantemente. Esto es: ahora mismo, no se puede asignar un List<Bulldog> a un List<Perro>, aunque Perro sea un ancestro de Bulldog. En teoría, esta opción que menciono permitiría que un lenguaje hipotético declarase legal esta asignación.
Me temo, sin embargo, que esta última posibilidad vaya acompañada de algún tipo de verificación en tiempo de ejecución, para mantener la integridad del sistema de tipos. Lo menciono porque la covarianza sí se permite con los tipos array, cuando los tipos bases son tipos de referencia. Pero en ese caso, las asignaciones a elementos tienen que verificar el tipo del elemento asignado. Esto se permite para poder ejecutar Java sobre .NET, pues Java ofrece este tipo de compatibilidad.

[13/dic]: ¡Buenas noticias! Trescientas y tantas descargas de Intuitive C# entre el lunes y el martes.

sábado, diciembre 09, 2006

C#: El lenguaje

IntSight: .NET TrainingYa está disponible como descarga gratuita el nuevo libro, o folleto, o como prefiera, sobre C#:
El contenido se ha desgajado de la serie A del curso Programación con ADO.NET en C#. No se trata de un tratamiento exhaustivo de la materia (sólo son 72 páginas A4), sino de una pasada rápida para ponerse a trabajar lo antes posible. Cubre .NET 2.0 y algunas de las novedades de C# 3.0.
Mi idea es ampliar y reestructura el contenido del libro sobre la marcha. No está "corregido": es posible que se me haya escapado alguna burrada, por lo que agradezco información sobre erratas.
... ah, y la descarga es gratis total, pero estoy seguro de que no le importará hacerme un favor a cambio: ¡cuénteselo a alguien!

Temas nuevos, respecto a la versión anterior: tipos y métodos genéricos, restricciones en genericidad, tipos anulables, operadores promovidos y el operador de fusión, bloques de iteración, métodos anónimos, expresiones lambda, atributos, constructores de instancias y estáticos, propiedades, indexadores, clases parciales.

miércoles, diciembre 06, 2006

Herramientas: Xara Xtreme Pro

Xara Xtreme Pro¿Me permite una recomendación? Si está buscando software para dibujo e ilustraciones, pruebe Xara Xtreme Pro. Es un editor de dibujo vectorial, que antes se vendía como Corel XARA. Es rápido. Es potente. Es versátil. La recomendación viene a cuento ahora porque me acabo de actualizar a la nueva versión Pro, para aprovechar la nueva función de animación para Flash: me interesa para vídeos de presentación de conceptos. No tiene toda la funcionalidad de Flash, pero el subconjunto de funciones implementado es bastante completo... y el precio es de risa. El único punto débil, en mi opinión, es el sencillo editor de fotos incorporado. Este permite corregir niveles mediante histogramas, controlar brillo, contraste, saturación, aplicar efectos mediante plug-ins compatibles con Photoshop... pero naturalmente, no es Photoshop. Su punto fuerte es el diseño vectorial, y los extras como la animación Flash.

Como he mencionado en otras ocasiones, los vídeos basados en secuencias de pantallas que acompañan a los cursos, están hechos con Camtasia Studio, del que, por cierto, acaban de sacar la versión 4.