2012-03-16 8 views
5

Mi piace molto Lua come linguaggio di programmazione MA, mi dà fastidio credere di dover digitare costantemente "local" per tutte le mie variabili locali.Il mio DSL per Lua funzionerebbe ...? (questo sembra troppo semplicemente per essere vero)

Rende solo il mio codice più ingombrante.

Quindi mi chiedo, posso creare un Domain Specific Language (DSL) su Lua per avere semplicemente la seguente convenzione di denominazione delle variabili.

  1. Se un nome di variabile è in lettere maiuscole, quindi è una variabile globale
  2. Altrimenti, la variabile è una local variabile

Domanda: Sarebbe questo lavoro - Sì o no?

In altre parole:

-- 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 = ... 

Così ora, il seguente codice nel predefinito Lua:

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

Con il mio DSL Lua:

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

UPDATE:

E le funzioni locali?

Come funziona il seguente codice?

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

Non sono sicuro di voler eseguire tutte le funzioni globali in maiuscolo.

Forse ho appena ignorato le funzioni e richiede l'identificatore 'local' ... pensieri?

+0

Interessante domanda. +1 Mi interessa vedere se questo è corretto o quale sarebbe il modo corretto di farlo. –

+3

Certo che "puoi" fare questo; scrivi un preprocessore che legge il tuo DSL e genera il sorgente Lua. Questo non è un compito banale, né è ovvio per me quanto valga la pena. Personalmente vedo poco in DSL che funzionano allo stesso livello di astrazione del linguaggio di implementazione; non risparmiano tempo né evitano errori. Il "dominio" in una lingua "specifica per dominio" di solito si riferisce al dominio dell'utente finale; tale giocatore del gioco, ragioniere, uomo d'affari e altri. –

+0

Quindi, dopo un anno, cosa è venuto fuori da questa idea? – lhf

risposta

3

Moonscript ha già tutte le variabili locali per impostazione predefinita e è necessario solo utilizzare la parola chiave di esportazione per dichiarare un globale. È un bel linguaggio di prossima generazione, simile a un coffeescript, e viene compilato da Lua. Lo uso ovunque io usi 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

Sfortunatamente, non sono un fan del coffeescript. Sai come potrei estrarre la parte di Moonscript che voglio usare senza usare il resto? – nickb

5

Poiché il cambiamento che si desidera è relativamente semplice, in pratica si hanno due opzioni. È possibile provare Metalua:

Metalua è un linguaggio e un compilatore che forniscono ...

  • Un sistema macro completo, simile al potere a quello che è offfered dai dialetti Lisp o Template Haskell; i programmi manipolati possono essere visti come codice sorgente , come alberi di sintassi astratti o come un mix arbitrario di essi, a seconda di quale si adatta meglio al tuo compito.
  • Un parser estensibile dinamicamente, che consente di supportare le macro con una sintassi che si integra perfettamente con il resto della lingua.

Oppure si può utilizzare token filters:

Il filtro token opere dandovi l'opportunità di ispezionare e altera il flusso di gettoni provenienti dal lexer prima di andare al parser. Puoi vedere solo token e puoi generare solo token - non ti è permesso vedere il testo in arrivo al lexer né a generare il testo da inserire nel lexer.

Entrambi gli approcci hanno i loro pro e contro. Metalua ti consente di apportare modifiche linguistiche di alto livello in Lua, ma ha una curva di apprendimento più ripida. I filtri token consentono di apportare semplici modifiche allo stream di token, ma hanno una potenza limitata (vedere 2005 talk).

Non sono sicuro che i filtri token siano sufficienti per il tuo caso, perché l'inserimento di local prima di ogni identificatore di avvio in minuscolo nell'assegnazione funzionerà solo per casi semplici. Che mi dici del seguente codice?

a = 1 
a = a * a 

Vuoi convertirlo in un singolo local, o si desidera che due?

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

Il primo, dato che "a" è già definito. – nickb

3

Sì, è possibile farlo, ma il risultato non è chiamato "lingua specifica del dominio". Si chiama "preprocessore".

Anch'io ero una volta incredibilmente infastidito da un problema con Lua — manca una dichiarazione switch o case. In realtà ho terminato la modifica dell'implementazione per supportare questa funzionalità. Ma alla fine ho deciso che non mi importava di programmare in un dialetto che solo io usavo.

Se si dispone di competenze di programmazione C, l'implementazione di Lua è molto pulita e il modo più semplice per raggiungere l'obiettivo è probabilmente modificare l'implementazione.

Problemi correlati