[Madrid-pm] PBP y prototipos

DervishD bugs en dervishd.net
Mar Mar 27 11:47:25 PDT 2007


    Hola Joaquín :)

 * Joaquín Ferrero <explorer en joaquinferrero.com> dixit:
> DervishD escribió:
> > Supongamos que una función nuestra espera un filehandle: ¿cómo se lo
> > pasamos como parámetro sin un prototipo si el filehandle no está
> > guardado en un escalar? Luego está el problema de usar ese
> > filehandle, ahí no entro, pero no se me ocurre otra forma de poder
> > hacer esto si yo escribo "testme":
> > 
> >     testme STDOUT, "mensaje"; # testme(*@)
> > 
> 
> Creo que eso está respondido en el 10.1 y 10.2: No usar barewords como
> filehandles.

    Cierto, pero eso puedo hacerlo yo en "testme", pero no en el código
que la utiliza. Y vale, puedo decir que paso de promover malos hábitos,
pero ciertamente se me ocurren bastantes casos en los que puede
interesar pasar como parámetro "STDOUT" o "STDERR" a una subrutina, y de
ahí mi pregunta.

> > Otra cosa para la que considero imprescindibles los prototipos es
> > para poder pasar bloques de código a una función y que se evaluen
> > después dentro de ella. Para eso uso "&" en el prototipo. ¿De qué
> > otra forma se pueden pasar bloques de código sin usar prototipos *y
> > sin que el bloque de código sea el último parámetro*? Por supuesto,
> > me refiero a bloques de código anónimos, si no se usa \&codeblock y
> > ya está, eso lo sé, y por otro lado querría evitar tener que poner
> > "sub" delante, para que quienes usen la función puedan escribir algo
> > como esto:
> > 
> >     testmeagain {
> >         print "loquesea";
> >         haz_algo_aquí;
> >         ...
> >     } "mensaje cuando termines";
> > 
> > así, sin la coma y sin "sub". Eso, sin prototipos, tampoco sé cómo
> > hacerlo.
> > 
> 
> Por lo que llevo leído (hasta el 12.0), Conway busca hacer un estilo limpio 
> tanto simplificando las estructuras a usar como facilitar la vida al lector 
> del programa, por lo que huye de construcciones demasiado complejas o de no 
> ahorrar escritura si eso facilita su comprensión.

    Cierto, si en eso estoy de acuerdo, pero es que también creo que a
veces conviene usar la sintáxis que propongo. Para mí, sin ir más lejos,
es más claro eso que escribo o bien una alternativa como esta:

    testmeagain sub {
        ...
    }, "mensaje o lo que sea";

    que meter la subrutina en un escalar y usar luego ese escalar, como
en el ejemplo que propones tú (y Conway).

> En tu caso, aplicar la 9.1: siempre usar paréntesis, aparte de que creo que él 
> buscaría pasar el código con el sub {}, pero fíjate en los ejemplos de la 
> 8.14, en la que usa funciones de Scalar::Util, List::Util y List::MoreUtils 
> de la misma forma que lo haces tu.

    Precisamente, en esos ejemplos se usa la sintáxis que yo propongo,
como en "first" o en "reduce", y esas *usan prototipos*.
 
> No sé si te he aclarado algo o te he liado más... 7B^)

    Sigo sin tener claro como hacer estas dos cosas sin prototipos. En
algunos casos Conway me parece demasiado tajante. Tengo claro que, por
seguir con los ejemplos de este mensaje, usar barewords como filehandles
o usar prototipos puede ser mala idea, pero por lo que yo interpreto del
libro, es como si Conway no viese ninguna razón buena para usarlos
alguna vez. Yo sí, tanto en los prototipos (para poder escribir
funciones como "first" o "reduce" de "List::Util") como en los
filehandles (de lo contrario, no puedes escribir una función que admita
un bareword filehandle como primer parámetro, al estilo de un builtin
como "print"). Este último caso admito que es menos común, pero el otro,
el de las subrutinas anónimas, me parece que no es tan raro ni tan
inválido. Lo que pregunto es si me estoy perdiendo algo o si de verdad
se puede evitar absolutamente el uso de prototipos, y eso ya no lo tengo
tan claro.

    Gracias por las referencias del PBP :))))
    
    Raúl Núñez de Arenas Coronado

-- 
Linux Registered User 88736 | http://www.dervishd.net
It's my PC and I'll cry if I want to... RAmen!


Más información sobre la lista de distribución Madrid-pm