2011-02-27 15 views
10

Tengo problemas para intentar crear palabras clave con Devel::Declare. No hay muchos ejemplos y tutoriales al respecto.Crear una nueva palabra clave Perl con Devel :: Declare

Mi proyecto favorito es el de crear una nueva palabra clave llamada doing que tienen una sintaxis similar a Ruby de do, como este:

my @arr = qw/foo bar baz/; 
@arr doing $x { 
    print "x is $x"; 
}; 

Mi idea es convertirlo en un comunicado for my $x (@arr) { ... } con Devel::Declare ganchos de análisis. No estoy seguro si esto es posible.

La mayoría de los ejemplos que he encontrado (del directorio de prueba Devel::Declare) son para crear una palabra clave de estilo method.

Agradecería algunos consejos sobre cómo empezar, o sobre las funciones clave que se deben usar para poder manejarlas, o sobre el código existente sobre el que se basa el mío.

Respuesta

14
  1. Devel :: Declare no le permitirá recuperar lo que ya ha sido analizado. Si convierte doing en una palabra clave, entonces @arr doing ... aún necesita ser transformado en algo que comienza con @arr, lo que parece un obstáculo bastante grande.
  2. Debido a la forma en que Devel :: Declare acutally hace su magia, está limitada de una manera específica: solo le permite declarar "palabras clave" que parecen nombres de subs, en lugares donde Perl será buscando para el nombre de un submarino. No te permitirá poner operadores arbitrarios donde quieras. De hecho, funciona con la menor contorsión en situaciones en las que tiene keywordsomestuff{ ... } la que se puede convertir en una simple llamada a keyword(algunas otras cosas y posiblemente transformadosub { ... }). Puedes ver por qué se presta tan bien a cosas como method o Test::Class::Sugar. Mi punto es que inmediatamente después del nombre de una matriz es no un lugar donde el analizador de perl busca el nombre de un sub; es un lugar donde el analizador busca un operador, por lo que @arr doing ... le dará un error bareword found where operator expected antes de que Devel :: Declare tenga alguna posibilidad de intervenir.

Tanto de los que probablemente podrían superarse cambiando las cosas para que su palabra clave aparece primera en la línea, pero ahora tiene keywordsomestuff{ ... } donde el nombre de la matriz es somestuff y estás firmemente dentro del patrón que la mayoría de los otros módulos han creado, solo si estás generando un bucle for, probablemente estarás abandonando el bloque como un bloque genuino en lugar de hacer que se analice como un sub definición en su lugar.

+2

Eso explica por qué todo está tan orientado a 'métodos'. Gracias. Por cierto, descubrí que puedo hacer algo bastante similar con Perl simple: '@arr ~~ sub {my $ x = shift; imprime "x es $ x"} '. Tal vez trate de combinar eso con Devel :: Declare. – ojosilva

Cuestiones relacionadas