Scusate se la discussione qui sotto potrebbe sembrare un po 'vaga, ma c'è troppo da dire.
Ho solo conoscenze teoriche di Lisp, non le mani.
Dall'altro lato, Forth potrebbe avere (ma il normale Forth non ha) una metaprogrammazione completa all'interno della lingua. Ma la metaprogrammazione è contemplata e possibile ma senza una sintassi coerente. Penso che lo stesso accada in Lisp.
Ho implementato una soluzione molto pulita che include questa possibilità in un piccolo paradigma del linguaggio simile a Forth. Per avere metaprogramming dovremmo essere in grado di riferirci a ciò che scriviamo. Così, quando scriviamo un programma da eseguire immediatelly come:
bread eat
dovremmo essere in grado anche di fare riferimento alla stessa frase con l'intento, invece di eseguirlo per conservarlo per riferimento futuro. Ciò potrebbe essere fatto scrivendo per es.
{ bread eat }
La frase sopra potrebbe avere come conseguenza di lasciare l'oggetto creato nello stack. Ma come abbiamo creato una nuova parola come {
e }
abbiamo il diritto di fare riferimento anche a quello.
Quindi, potremmo piace fare riferimento a:
{ bread
Come potremmo fare riferimento a questo? Una sintassi provvisoria è: {{ { bread }}
.
Se diamo il nome XXX
alla frase precedente potremmo scrivere la frase iniziale:
XXX eat }
e la frase di cui sopra dovrebbe funzionare correttamente nel lasciare sullo stack i
{ bread eat }
Come Non so se quello che dico è esattamente ciò che stai cercando, basti dire che con il ragionamento di cui sopra e la loro implementazione all'interno di Forth ogni parola ottiene un livello di esecuzione e che definisce qual è il livello di metaprogrammazione della parola.
Ovviamente, abbiamo il primo livello di infinito e ogni livello successivo. Quindi i livelli di esecuzione sono basati sull'infinito matematico.
Ho implementato il suddetto all'interno di una sorta di Forth e al primo livello (sotto infinito) tutto funziona senza intoppi. Così, per esempio un sono in grado di cambiare la sintassi di:
{ bread eat } { tomatos eat } x 3 = if
in:
{ bread eat | tomatos eat } x 3 = if
che viene fatto definendo |
come } {
come muggito:
{{ } { }} "|" define
o se ti piace meglio come:
2{ } { 2} "|" define
Il metodo sopra porta all'interno della lingua con una sintassi corretta la meta lingua e lo rende linguaggio.
Quindi, a mio parere, sia Lisp che Forth hanno la possibilità di metaprogrammazione, ma entrambi mancano di tale possibilità come parte integrante della lingua.
Ho ulteriori dettagli su questo su napl.wikispaces.com.
Questo è molto più specifico della versione precedente, [Lisp e Forth macro [[in attesa \]] (http://stackoverflow.com/q/24272856/1281433), che è buono.Certo, ora * quella * domanda ha riaperto i voti, e questo ha un voto ravvicinato, quindi c'è una certa confusione su quale di questi dovrebbe effettivamente rimanere aperto. È molto più chiaro ciò che stai cercando in questa domanda, ma è ancora probabilmente fuori tema, perché ["la domanda di confronto è inadatta per \ [Stack Overflow \], perché non ci sono limiti alle risposte che possono essere postate loro ".] (http://meta.stackoverflow.com/q/251328/1281433). –
Il motivo di chiusura ** troppo ampio ** si applica qui: "Ci sono * troppe risposte possibili *, o le risposte positive sarebbero troppo lunghe per questo formato." Questa non è affatto una brutta domanda **; non è particolarmente adatto per Stack Overflow. Per esempio, questa domanda potrebbe essere ottima in comp.lang.lisp. –
La sottoregione particolare, "c'è qualcosa che puoi fare con la prima che non puoi fare con quest'ultima? O viceversa?" è probabilmente il più specifico qui. Potrebbe ancora ammettere troppe risposte, ma se c'è qualcosa che si può fare a differenza dell'altro, è probabilmente possibile dare una risposta relativamente canonica. –