El fin de semana pasada me entro una inquietud. Saber como quedaría una tarjeta de presentación/visita de un programador. Y que ademas la tarjeta de presentación fuese un programa. Así que me he puesto a ello y aquí presento el resultado.
Empecemos con un par de reglas para hacer la tarjeta:
- Todo el texto debe poder compilarse/ejecutarse
- La información normal de una tarjeta de visita debe de quedar clara en el texto
- El texto tiene que ser suficientemente corto como para caber en una tarjeta
Yo aparte, en mi caso añadí la siguiente regla, tiene que ser en Haskell. Y esta es la primera versión que se me ocurrió:
data Career = Actor | Programmer | TaxiDriver | Writer
deriving( Show )
type Name = String
type Contact = String
careerOf :: Name -> Maybe Career
careerOf "Luis Jose Cabellos Gomez" = Just Programmer
careerOf _ = Nothing
contactOf :: Name -> Contact
contactOf "Luis Jose Cabellos Gomez" = "zhen.sydow at gmail.com"
main = putStrLn.unlines $ map
(\f-> f "Luis Jose Cabellos Gomez")
[ id, show.careerOf, contactOf ]
Lo que me gusta del código anterior es que la definición de las funciones por reglas hace que se lean casi como frases. También me gusta el chiste con el monad Maybe, Luis es "Just a Programmer", no me digáis que no queda bien. Lo que no me acaba de gustar es que las funciones son muy artificiales, y se repite en muchos sitios mi nombre. Y luego la función principal es muy confusa. Y para una definición de tipos tan triste, mejor nos quedamos con las macros de C.
Pasemos a la segunda versión.
data Career = Actor | Programmer | TaxiDriver | Writer
deriving Show
data Person = Person { name :: String
, career :: Maybe Career
, contact :: String }
deriving Show
me = Person "Luis Jose Cabellos Gomez"
(Just Programmer)
"zhen.sydow at gmail.com"
main = putStrLn $ show meLa segunda versión tiene lo bueno de la primera versión (no me podía quedar sin el chiste del Maybe) y tiene un par de mejoras. La función principal es muy sucinta, y la información principal no esta tan desperdigada. Ademas de tener una definición de tipos más completa. Me quedo con esta versión.
Cuando ya tenía el texto, pues me puse a decorarlo un poco. Se me ocurrió imprimirlo como su fuese una carta de poker. Usando el Inkscape me hice un símbolo lambda y lo puse como si fuese el palo de la baraja. A partir de ahora el poker se juega con corazones, diamantes, picas, tréboles y lambdas. Lo puse todo sobre una imagen, puse en negrita los datos . Y ya esta, ya tenia tarjeta de programador. A imprimirlo.

Y este es el resultado final. Tengo que decir que la impresora no lo imprimió todo lo bien que me gustaría. Y quizás con una fuente un poco más clara el resultado hubiese sido mejor, pero....
... me pregunto si será posible hacer algo tan elegante en código C++.
UPDATES:
FIN UPDATES