Il supporto delle macro in un linguaggio di programmazione è considerato dannoso?

8

Il primo abuso che mi viene in mente in C è:

#define if while 

Ma allo stesso tempo è estremamente maneggevole e potente se usato correttamente.

Qualcosa di simile accade con le macro Common Lisp.

Perché non tutti i linguaggi di programmazione supportano macro come questa e quali sono le alternative?

Sono considerati dannosi?

    
posta OscarRyz 20.12.2010 - 21:26
fonte

3 risposte

15

Sono dell'opinione che se una lingua ha macro, dovrebbero essere una parte ben pianificata e pianificata della lingua e non del compilatore .

Esempio, il sistema macro di Lisp è una funzionalità di linguaggio integrato molto potente ed è soggetto a tutte le regole e le regole dello stesso Lisp.

Il contro-esempio, il sistema macro C / C ++ è separato dal linguaggio e incorporato nel compilatore. Il risultato è che non sei limitato ai vincoli della tua lingua e puoi creare codice non valido e ridefinire parole chiave specifiche della lingua.

Alla fine della giornata, ci sono diverse lingue che non hanno funzionalità macro - ma quelle fature non sono perse tanto. Tutto dipende da quanto è espressivo un linguaggio e se ha approcci alternativi alla meta-programmazione. La meta-programmazione è solo un modo per garantire che quando fai X, X sia fatto nello stesso modo in tutta l'applicazione.

    
risposta data 20.12.2010 - 21:40
fonte
8

Le macro C e le macro Lisp sono completamente diverse. Le macro C vengono espanse utilizzando la sostituzione delle stringhe prima che venga eseguita qualsiasi altra elaborazione. Le macro Lisp vengono espanse dopo che il testo di input è stato analizzato in un albero di sintassi 1 e possono utilizzare l'intera lingua durante l'espansione. Con le macro Lisp, non puoi solo fare cose stupide come #define begin { , ma puoi definire le tue strutture di controllo e persino compilare gli array in fase di compilazione usando il codice che desideri.

Un motivo per cui non sono inclusi i macro è che qualcosa di più complicato della semplice sostituzione delle stringhe può essere molto difficile da utilizzare nelle lingue con sintassi in stile C. Un altro reclamo relativo alle macro è che possono rendere il codice più difficile da leggere, il che può essere vero se non implementato abilmente. Le macro Lisp ben scritte possono rendere il codice più facile da leggere.

1 tranne le macro di lettura, che vengono espanse durante il processo di creazione dell'albero della sintassi.

    
risposta data 20.12.2010 - 21:42
fonte
2

Non penso ci sia una ragione specifica per cui non sono supportati in alcune lingue, come per il fatto che alcuni sono case sensitive e altri no. Di solito non c'è una vera ragione, solo una decisione presa.

MA la ragione per cui non sono inclusi sicuramente non è la sicurezza.

#define X Y
L'istruzione

cambia tutte le X in Y in fase di compilazione. Se puoi modificare le istruzioni #define, puoi semplicemente copiare / sostituire la fonte che ti interessava cambiare e compilare di nuovo.

    
risposta data 20.12.2010 - 21:33
fonte

Leggi altre domande sui tag