Es tut uns leid, wenn die Diskussion unten etwas vage erscheint, aber es gibt zu viel zu sagen.
Ich habe nur theoretische Kenntnisse von Lisp, nicht Hands on.
Auf der anderen Seite könnte Forth eine vollständige Metaprogrammierung innerhalb der Sprache haben (aber normale Forth hat nicht). Metaprogrammierung ist jedoch möglich und möglich, aber ohne kohärente Syntax. Ich denke, das gleiche passiert in Lisp.
Ich habe eine sehr saubere Lösung mit dieser Möglichkeit in einem kleinen Paradigma von Forth wie Sprache implementiert. Um Metaprogrammierung zu haben, sollten wir in der Lage sein, auf das zu verweisen, was wir schreiben. Also, wenn wir ein Programm schreiben, ausgeführt werden immediatelly wie:
bread eat
wir sollten mit der Absicht, auf den gleichen Satz zu der Lage sein, zu beziehen, anstatt sie auszuführen, es zu halten für den späteren Gebrauch auf. Das könnte getan werden, indem z.B.
{ bread eat }
oben Die Phrase als Folge haben könnte, das erstellte Objekt auf dem Stapel zu lassen. Aber da wir ein neues Wort als {
und }
erstellt haben, haben wir auch das Recht darauf zu verweisen.
So konnten wir verweisen mögen:
{ bread
Wie könnten wir auf das verweisen? Eine vorläufige Syntax lautet: {{ { bread }}
.
Wenn wir den Namen XXX
zum vorherigen Ausdruck geben könnten wir den anfänglichen Satz als schreiben:
XXX eat }
und die Phrase oben sollte korrekt auf dem Stapel zu verlassen arbeitet die
{ bread eat }
Wie Ich weiß nicht, ob das, was ich sage, genau das ist, wonach du suchst, es genügt zu sagen, dass durch die obige Argumentation und ihre Implementierung in Forth jedes Wort eine Ausführungsebene erhält und definiert, welches Niveau die Metaprogrammierung des Wortes ist.
Offensichtlich haben wir die erste Unendlichkeitsstufe und jede nachfolgende Ebene. Daher basieren die Ausführungsebenen auf der mathematischen Unendlichkeit.
Ich habe das oben in einer Art von Forth implementiert und auf der ersten Ebene (unter unendlich) funktioniert alles reibungslos.
{ bread eat } { tomatos eat } x 3 = if
in: So zum Beispiel in der Lage eine Uhr die Syntax ändern
{ bread eat | tomatos eat } x 3 = if
Das wird durch die Definition |
als } {
als Gebrüll getan:
{{ } { }} "|" define
oder wenn Sie mögen es besser als:
2{ } { 2} "|" define
Die obige Methode nimmt innerhalb der Sprache mit einer korrekten Syntax die Metasprache und macht sie zur Sprache.
So haben meiner Meinung nach beide Lisp und Forth die Möglichkeit der Metaprogrammierung, aber beide fehlt diese Möglichkeit als integrierender Teil der Sprache.
Ich habe mehr Details dazu auf napl.wikispaces.com.
Dies ist viel spezifischer als die vorherige Version, [Lisp und Forth Makros \ [in der Warteschleife]] (http://stackoverflow.com/q/24272856/1281433), was gut ist.Natürlich, jetzt hat diese Frage erneut Stimmen, und das hat eine enge Abstimmung, also gibt es einige Verwirrung darüber, welche davon eigentlich offen bleiben sollte. Es ist viel klarer, was Sie in dieser Frage suchen, aber es ist immer noch off-Thema, weil ["Vergleichs-Frage sind eine schlechte Passform für \ [Stack Overflow \], da es keine Grenzen zu den Antworten gibt, die gebucht werden können sie. "] (http://meta.stackoverflow.com/q/251328/1281433). –
Der enge Grund ** zu breit ** gilt hier: "Es gibt entweder * zu viele mögliche Antworten * oder gute Antworten wären für dieses Format zu lang." Das ist überhaupt keine schlechte Frage. es ist einfach nicht besonders gut für Stack Overflow geeignet. Diese Frage könnte zum Beispiel in comp.lang.lisp groß sein. –
Die besondere Teilfrage, "gibt es etwas, was man mit dem ersteren machen kann, was man mit letzterem nicht machen kann? Oder umgekehrt?" ist wahrscheinlich das spezifischste hier. Es könnte immer noch zu viele Antworten geben, aber wenn es etwas gibt, was man tun kann, was das andere nicht kann, ist es wahrscheinlich möglich, eine relativ kanonische Antwort zu geben. –