Oltre alle macro, esistono altre tecniche di metaprogrammazione? [duplicare]

2

Sto facendo un linguaggio di programmazione e, avendo trascorso un po 'di tempo in Lisp / Scheme, sento che il mio linguaggio dovrebbe essere malleabile. Dovrei usare macro, o c'è qualcos'altro che potrei / dovrei usare? La sintassi malleabile è anche una buona idea? È forse un concetto troppo potente?

Nel fare alcune ricerche, ho trovato fexprs . Non capisco davvero cosa siano. Aiutalo con una risposta anche per favore.

È possibile avere una lingua con macro / qualcosa-di-un-simile-natura senza avere s-espressioni?

    
posta mhr 28.09.2012 - 23:36
fonte

2 risposte

5

Potresti dare un'occhiata a Ruby, che ha un grande supporto per metaprogrammazione. Il libro Eloquent Ruby copre bene la lingua, con una notevole attenzione alla metaprogrammazione nei capitoli successivi. C'è anche un libro chiamato Metaprogramming Ruby che è ben recensito, ma che non ho ancora letto personalmente.

La metaprogrammazione in Ruby è molto più flessibile (e potente ... e pericolosa) di quanto fornito dalle librerie Reflection di .NET (dal momento che Guy Coder ha menzionato C # nella sua risposta, ho pensato che questo confronto potesse essere utile). In Ruby, puoi usare gli hook per selezionare dinamicamente i moduli di mixin che vuoi aggiungere a una classe in fase di esecuzione, utilizzare "method_missing" per gestire e delegare errori in modo flessibile, utilizzare le patch di scimmia per scegliere quale codice aggiungere in modo dinamico e immergerti tutti i tipi di problemi incredibilmente sorprendenti che scrivono codice auto-modificante. Ciò rende Ruby un linguaggio molto potente per, ad es., Scrivere il tuo linguaggio specifico per il dominio (DSL).

Nota: ho usato molto gergo nel secondo paragrafo. La mia speranza è che questo fornirà alle persone che sono interessate a maggiori informazioni con i termini di ricerca per le ricerche sul web, nel caso qualcuno voglia saperne di più ma non è ancora pronto ad acquistare un libro sull'argomento.

    
risposta data 29.09.2012 - 01:26
fonte
1

Poiché non so esattamente cosa intendi per malleabile, per lo scopo di questa domanda prenderò per significato un linguaggio che può essere esteso.

Pur comprendendo il concetto di LISP macros e come estende la lingua, la lingua che più mi associo a questa capacità è PROLOG.

PROLOG ha la capacità di definire nuove clausole e aggiungerle alla sua base di conoscenza usando il comando assert. Le clausole possono anche essere rimosse dal comando di ritiro.

Facendo un passo più lontano dal PROLOG dove il concetto è incorporato nella lingua e in linguaggi in cui il codice runtime dinamico può essere modificato con la programmazione Meta o la riflessione, allora troviamo linguaggi come Java e C #.

A mio avviso, se stai progettando una nuova lingua e cosa dare la malleabilità, allora inizia con il modo in cui PROLOG lo fa naturalmente nella lingua e costruisci da lì. Le lingue che usano altri mezzi per ottenere la malleabilità secondo me lo trattano come un ripensamento e ciò dimostra.

Ad esempio, dai un'occhiata a Mercury . Questo è linguaggio funzionale / logico che è malleabile e tuttavia è più di un semplice PROLOG.

    
risposta data 28.09.2012 - 23:54
fonte

Leggi altre domande sui tag