2012-03-16 12 views
5

Me encanta Lua como lenguaje de programación PERO me molesta tener que escribir constantemente "local" para todas mis variables locales.¿Mi DSL para Lua funcionaría ...? (Esto parece demasiado simple para ser verdad)

Simplemente hace que mi código parezca más desordenado.

Así que me pregunto si puedo crear un lenguaje específico de dominio (DSL) encima de Lua para simplemente tener la siguiente convención de nomenclatura variable.

  1. Si un nombre de variable es en letras mayúsculas, entonces es una variable global
  2. lo demás, la variable es una local variables

Pregunta: Que este trabajo - ¿Sí o no?

En otras palabras:

-- In Lua 5.2 
isGlobalinLua = "is global in default Lua" 
GLOBALVAR  = "is global var in default Lua" 
local localvar = "is local var in default Lua" 

-- In my DSL Lua language 
isLocalinDSLLua = "is local in DSL Lua" -- translates to: local isLocalinDSLLua = ... 
GLOBALVAR  = "is global DSL Lua" 
localvar  = "is local var in DSL Lua" -- translates to: local localvar = ... 

por lo que ahora, el siguiente código en su defecto Lua:

myglobal = 10 
local a = 1 
if a > 1 then 
    local b = 2 
    print b 
else 
    local c = 3 
    print c + myglobal 
end 

Con mi DSL Lua:

MYGLOBAL = 10 
a = 1 
if a > 1 then 
    b = 2 
    print b 
else 
    c = 3 
    print c + MYGLOBAL 
end 

ACTUALIZACIÓN:

¿Qué pasa con las funciones locales?

¿Cómo funcionaría el siguiente código?

myfunc = function (...) -- local myfunc = function (...) 

No estoy seguro de que quiera realizar todas las funciones globales en mayúsculas.

Tal vez simplemente ignoro funciones y requiera el identificador 'local' ... ¿pensamientos?

+0

Interesante pregunta. +1 Estoy interesado en ver si esto es correcto o cuál sería la forma correcta de hacerlo. –

+3

Por supuesto que "puedes" hacer esto; escribe un preprocesador que lea tu DSL y emita la fuente de Lua. Esta no es una tarea trivial, ni es obvio para mí lo que vale la pena. Personalmente, veo poco interés en las DSL que funcionan en el mismo nivel de abstracción que el lenguaje de implementación; no ahorran tiempo ni evitan errores. El "dominio" en un lenguaje "específico del dominio" generalmente se refiere al dominio del usuario final; tal jugador jugador, contador, hombre de negocios, et al. –

+0

Entonces, después de un año, ¿qué salió de esta idea? – lhf

Respuesta

3

Moonscript ya tiene todas las variables locales por defecto y solo necesita usar exportar palabra clave para declarar un global. Es un lenguaje muy agradable de nueva generación, parecido al coffeescript y compila para Lua. Lo uso dondequiera que solía usar Lua.

foo = 'bar' -- local 
square (x) -> x*x -- local 

-- globals 
export square 
export MY_GLOBAL = 12 

export class Foo 
    new: (bar) => @bar = bar -- self.bar = bar 
    get_bar: => @bar 
+0

Lamentablemente, no soy un fanático de coffeescript. ¿Sabes cómo podría sacar la parte de Moonscript que quiero usar sin usar el resto? – nickb

5

Dado que el cambio que desea es relativamente simple, básicamente tiene dos opciones. Puede probar Metalua:

Metalua es un lenguaje y un compilador que proporcionan ...

  • Un sistema de macro completa, similar en potencia a lo que está por offfered dialectos Lisp o Plantilla Haskell; los programas manipulados se pueden ver como código fuente, como árboles sintácticos abstractos, o como una combinación arbitraria del mismo, , lo que mejor se adapte a su tarea.
  • Analizador dinámicamente extensible, que le permite soportar sus macros con una sintaxis que se combina muy bien con el resto del lenguaje.

O puede utilizar token filters:

funciona el filtro de testigo por que le da la oportunidad de inspeccionar y altera el flujo de símbolos procedentes del analizador léxico antes de ir a la analizador. Solo puedes ver tokens y solo puedes generar tokens ; no puedes ver el texto que llega al lector ni generar texto para ir al lector.

Ambos enfoques tienen sus pros y sus contras. Metalua le permite realizar modificaciones de lenguaje de alto nivel en Lua, pero tiene una curva de aprendizaje más pronunciada. Los filtros de tokens le permiten realizar modificaciones simples en la secuencia de tokens, pero tienen una potencia limitada (consulte 2005 talk).

No estoy seguro de si los filtros token son suficientes para su caso, porque insertar local antes de cada identificador de inicio en minúsculas en la asignación solo funcionará para casos simples. ¿Qué pasa con el siguiente código?

a = 1 
a = a * a 

¿Quieres convertirla en un solo local, o quieres dos?

local a = 1  vs. local a = 1 
a * a     local a = a * a -- valid in Lua, creates a new variable 
+0

El primero, dado que "a" ya está definido. – nickb

3

Sí, puede hacer esto, pero el resultado no se denomina "lenguaje específico de dominio". Se llama un "preprocesador".

Yo, también, una vez estuve increíblemente molesto por un problema con Lua — que carece de una declaración switch o case. De hecho terminé modificando la implementación para soportar esta característica. Pero finalmente decidí que no me importaba programar en un dialecto que solo yo usaba.

Si tiene habilidades de programación en C, la implementación de Lua es muy limpia, y la manera más fácil para que logre su objetivo es, probablemente, solo modificar la implementación.

Cuestiones relacionadas