Considerando che questa domanda è stata posta qualche anno fa, cercherò di aggiungervi altro in base alle tecnologie attuali.
A partire da ECMAScript 6, la metaprogrammazione è ora supportata in un certo senso tramite gli oggetti Symbol, Reflect e Proxy.
Effettuando una ricerca sul web, ho trovato una serie di articoli molto interessanti sul tema, scritto da Keith Kirkel:
Metaprogramming in ES6: Symbols and why they're awesome
In breve, I simboli sono nuove primitive che possono essere aggiunti all'interno di un oggetto (senza praticamente essere proprietà) e sono molto utili per passare le proprietà di metaprogrammazione ad esso tra gli altri. I simboli consistono nel modificare il comportamento delle classi esistenti modificandole (Riflessione nell'implementazione).
Metaprogramming in ES6: Part 2 - Reflect
In breve, riflettere è effettivamente un insieme di tutti questi “metodi interni” che erano disponibili esclusivamente attraverso le parti interne del motore JavaScript, ora esposte in un unico oggetto pratico. Il suo utilizzo è analogo alle capacità di Reflection di Java e C#. Sono usati per scoprire informazioni di livello molto basso sul tuo codice (Riflessione attraverso l'introspezione).
Metaprogramming in ES6: Part 3 - Proxies
In breve, Proxy sono oggetti gestori, responsabili per avvolgere gli oggetti e intercettando loro comportamenti attraverso trappole (Reflection attraverso intercessione).
Ovviamente, questi oggetti forniscono capacità di metaprogrammazione specifiche, molto più restrittive rispetto ai linguaggi di metaprogrammazione, ma possono comunque fornire metodi pratici di metaprogrammazione di base, principalmente attraverso le pratiche di riflessione.
Alla fine, vale la pena ricordare che c'è qualcosa che vale la pena notare ongoing research work sulla metaprogrammazione a fasi in JavaScript.
\ * cough \ * http://www.hugoware.net/Projects/jLinq \ * cough \ * –
È possibile inserire il codice in un tag HTML o in un file di testo. Quindi puoi avere il tuo DSL con Javascript ... – Philip