Wie weit kann Lisp-Makros gehen?

stimmen
43

Ich habe viel gelesen, die Lisp-Syntax on the fly neu definieren kann, vermutlich mit Makros. Ich bin gespannt, wie weit geht das eigentlich gehen? Können Sie die Struktur der Sprache so viel neu zu definieren, dass es grenzwertig ein Compiler für eine andere Sprache wird? Zum Beispiel könnten Sie die funktionelle Natur der LISP in eine objektorientierten Syntax und Semantik ändern, sagt vielleicht Syntax mit näher an etwas wie Ruby?

Insbesondere ist es möglich loswerden der Klammer Hölle bekommen Makros? Ich habe genug (Emacs-) LISP gelernt Emacs mit meinen eigenen Mikro-Funktionen anpassen, aber ich bin sehr gespannt, wie weit Makros in dem Anpassen die Sprache gehen.

Veröffentlicht am 05/08/2008 um 08:32
quelle vom benutzer
In anderen Sprachen...                            


14 antworten

stimmen
33

Das ist eine wirklich gute Frage.

Ich denke, es ist nuanciert, aber auf jeden Fall verantwortlich:

Makros werden nicht in s-Ausdrücke stecken. Sehen Sie die LOOP-Makro für eine sehr komplexe Sprache geschrieben mit Stichworten (Symbole). So, während Sie die Schleife mit Klammern beginnen und enden können, in er seine eigene Syntax hat.

Beispiel:

(loop for x from 0 below 100
      when (even x)
      collect x)

Davon abgesehen, die meisten einfachen Makros nur verwenden s-Ausdrücke. Und Sie würden „stecken“ mit ihnen.

Aber s-Ausdrücke, wie Sergio beantwortet hat, beginnen direkt zu spüren. Die Syntax wird aus dem Weg und Sie beginnen in der Syntaxbaum-Codierung.

Wie für Leser Makros, ja, könnten Sie möglicherweise so etwas schreiben:

#R{
      ruby.code.goes.here
  }

Aber müssen Sie Ihren eigenen Ruby-Syntax-Parser zu schreiben.

Sie können auch einige der Ruby-Konstrukte, wie Blöcke, mit Makros imitieren, die zu den bestehenden Lisp Konstrukte kompilieren.

#B(some lisp (code goes here))

übersetzen würde zu

(lambda () (some lisp (code goes here)))

Sehen Sie diese Seite , wie es zu tun.

Beantwortet am 15/09/2008 um 16:07
quelle vom benutzer

stimmen
20

Ja, können Sie die Syntax neu zu definieren, so dass Lisp ein Compiler wird. Sie verwenden diese „Reader Makros“, die aus dem normalen „Compiler-Makros“ unterschiedlich sind, dass Sie wahrscheinlich denken.

Common Lisp hat die eingebaute in der Einrichtung neue Syntax zu definieren , für die Leser und Leser Makros , die Syntax zu verarbeiten. Diese Verarbeitung wird bei Lese-Zeit getan (die vor kommen kompilieren oder eval Zeit). Um mehr über die Definition Leser Makros in Common Lisp zu lernen, finden Sie in der Common Lisp Hyperspec - Sie wollen lesen , Ch. 2, "Syntax" und Ch. 23, "Reader" . (Ich glaube Schema die gleiche Anlage hat, aber ich bin nicht so vertraut mit ihm - den siehe Schema Quellen für die Arc - Programmiersprache ).

Als einfaches Beispiel, nehmen wir an, Sie Lisp geschweiften Klammern statt Klammern verwenden möchten. Dies erfordert so etwas wie die folgenden Leser Definitionen:

;; { and } become list delimiters, along with ( and ).
(set-syntax-from-char #\{ #\( )
(defun lcurly-brace-reader (stream inchar) ; this was way too easy to do.
  (declare (ignore inchar))
  (read-delimited-list #\} stream t))
(set-macro-character #\{ #'lcurly-brace-reader)

(set-macro-character #\} (get-macro-character #\) ))
(set-syntax-from-char #\} #\) )

;; un-lisp -- make parens meaningless
(set-syntax-from-char #\) #\] ) ; ( and ) become normal braces
(set-syntax-from-char #\( #\[ )

Sie sagen , dass die Lisp {wie a (und dass das} wie a). Dann erstellen Sie eine Funktion ( lcurly-brace-reader) , dass der Leser rufen, wann immer es eine sieht {, und verwenden Sie set-macro-characterdiese Funktion , um die zuweisen {. Dann sagen Sie Lisp , dass (und) sind wie [und] (das heißt, nicht sinnvoll Syntax).

Andere Dinge , die Sie tun können , umfassen zum Beispiel eine neue String - Syntax Erstellen oder mit [und] in-fix - Notation zu umschließen und in S-Ausdrücke zu verarbeiten.

Sie können auch weit darüber hinaus, die Neudefinition die gesamte Syntax mit Ihren eigenen Makro Zeichen gehen , die Aktionen im Leser auslösen, so dass der Himmel ist wirklich die Grenze. Dies ist nur einer der Gründe , warum Paul Graham und andere sagen Sie , dass Lisp eine gute Sprache , in der einen Compiler zu schreiben.

Beantwortet am 16/09/2008 um 20:28
quelle vom benutzer

stimmen
16

Ich bin kein Experte Lisp, Heck ich bin nicht einmal ein Lisp-Programmierer, aber nach einem wenig mit der Sprache des Experimentierens ich zu dem Schluss gekommen, dass die Klammer nach einer Weile beginnen ‚unsichtbar‘ zu werden und Sie beginnen, sehen Sie den Code als Sie wollen es sein. Sie beginnen, mehr Aufmerksamkeit auf die syntaktischen Konstrukte zahlen Sie über s-exprs und Makros erstellen, und weniger auf die lexikalische Form des Textes von Listen und Klammer.

Dies gilt besonders, wenn Sie die Vorteile eines guten Editor nehmen, die mit der Vertiefung und Syntaxfärbung hilft (versuchen Sie die Klammer zu einer Farbe sehr ähnlich wie die Hintergrundeinstellung).

Sie könnten nicht in der Lage sein, die Sprache vollständig und erhält ‚Ruby‘ Syntax zu ersetzen, aber Sie brauchen es nicht. Dank der Sprach Flexibilität, die Sie einen Dialekt enden könnte, die sich wie Sie fühlt sich nach dem ‚Ruby Art der Programmierung‘, wenn Sie wollen, was auch immer das würde für Sie bedeuten.

Ich weiß, dass dies nur eine empirische Beobachtung ist, aber ich denke, dass ich eine jener Lisp Erleuchtung Momente hatte, als ich dies realisiert.

Beantwortet am 26/08/2008 um 10:49
quelle vom benutzer

stimmen
15

Immer und immer wieder, Neulinge in Lisp wollen „loszuwerden, alle Klammern.“ Es dauert ein paar Wochen. Kein Projekt eine ernsthafte Allzweck-Programmierung Syntax auf dem üblichen S-Ausdrucksparser zu bauen wird jemals irgendwo, weil Programmierer aufzuwickeln immer lieber, was Sie gerade als wahrnehmen „Klammer die Hölle.“ Es dauert ein wenig gewöhnungsbedürftig, aber nicht viel! Sobald Sie sich daran gewöhnen können, und Sie können die Plastizität der Standardsyntax gehen zurück auf Sprachen wirklich schätzen, wo gibt es nur einen Weg, ein bestimmtes Programmierkonstrukt auszudrücken, ist wirklich Gitter.

Davon abgesehen, ist Lisp ein ausgezeichnetes Substrat für den Aufbau von domänenspezifischen Sprachen. Genau so gut wie, wenn nicht besser als XML.

Viel Glück!

Beantwortet am 16/09/2008 um 20:29
quelle vom benutzer

stimmen
12

Die beste Erklärung von Lisp-Makros die ich je gesehen habe, ist bei

https://www.youtube.com/watch?v=4NO83wZVT0A

bei ca. 55 Minuten ab. Dies ist ein Video einer von Peter Seibel, der Autor von „Practical Common Lisp“, da der Rede, die das beste Lisp Lehrbuch ist da.

Die Motivation für Lisp-Makros ist in der Regel schwer zu erklären, weil sie in Situationen kommen, in ihre eigenen wirklich, die zu lang sind, ein einfaches Tutorial zu präsentieren in. Peter kommt mit einem großen Beispiel oben; Sie können es vollständig erfassen, und es macht gut, die ordnungsgemäße Verwendung von Lisp-Makros.

Sie fragte: „kann man den funktionalen Charakter von LISP in eine objektorientierten Syntax und Semantik ändern“. Die Antwort ist ja. In der Tat hat Lisp ursprünglich keine objektorientierte Programmierung überhaupt nicht, da Lisp überraschend hat es schon seit so gewesen, bevor die objektorientierten Programmierung! Aber wenn wir zum ersten Mal über OOP 1978 gelernt haben, waren wir in der Lage, es zu addieren leicht Lisp, mit unter anderem, Makros. Schließlich wird das Common Lisp Object System (CLOS) entwickelt, ein sehr leistungsfähiges objektorientiertes Programmiersystem, das elegant in Lisp paßt. Das Ganze kann als Erweiterung geladen werden - nichts ist eingebaut! Es ist alles mit Makros getan.

Lisp hat eine ganz andere Funktion „Leser Makros“ genannt, die verwendet werden können, die Oberfläche Syntax der Sprache zu erweitern. Mit Leser Makros können Sie Subsprachen machen die C-ähnliche oder Ruby-ähnliche Syntax haben. Sie wandeln den Text in Lisp, intern. Diese sind nicht weit von den meisten realen Lisp-Programmierer verwendet, vor allem, weil es schwierig ist, die interaktive Entwicklungsumgebung zu erweitern, die neue Syntax zu verstehen. Zum Beispiel Einzug Emacs Befehle würden durch eine neue Syntax zu verwechseln. Wenn Sie energisch sind, obwohl, ist Emacs auch erweiterbar, und man konnte es über Ihre neue lexikalische Syntax lehren.

Beantwortet am 05/10/2008 um 16:03
quelle vom benutzer

stimmen
11

Regelmäßige Makros arbeiten auf Listen von Objekten. Am häufigsten sind diese Objekte andere Listen (also Bäume bilden) und Symbole, aber sie können andere Objekte wie Strings sein, Hash - Tabellen, benutzerdefinierte Objekte usw. Diese Strukturen genannt werden s-EXPS .

Also, wenn Sie eine Quelldatei laden, Ihr Lisp-Compiler wird den Text und produziert s-EXPS analysiert. Makros arbeiten auf diesen. Dies funktioniert gut und es ist ein wunderbarer Weg, um die Sprache im Geist des s-EXPS zu verlängern.

Zusätzlich kann das zuvor erwähnte Parsing-Prozess durch „Leser Makros“ erweitert werden, dass Sie die Art und Weise lassen passen Sie Ihre Compiler Text s-EXPS dreht. Ich schlage vor, Sie jedoch, dass Sie Lisp Syntax umarmen statt sonst es in etwas zu biegen.

Sie klingen ein wenig verwirren , wenn Sie Lisp ist „funktionelle Natur“ und Rubys „objektorientierte Syntax“ nennen. Ich bin mir nicht sicher , was „objektorientierte Syntax“ sein soll, aber Lisp ist eine Multi-Paradigma Sprache und unterstützt die objektorientierte Programmierung extremelly gut.

Übrigens, wenn ich Lisp sage, meine ich Common Lisp .

Ich schlage vor , Sie Ihre Vorurteile wegräumen und geben Lisp eine ehrliche gehen .

Beantwortet am 26/08/2008 um 10:36
quelle vom benutzer

stimmen
9

Was Sie fragen, ist so etwas wie die Frage, wie ein Experte Chocolatier zu werden, so dass Sie das ganze höllische braune Zeug von Ihrem Lieblings-Schokoladenkuchen entfernen.

Beantwortet am 17/09/2008 um 13:14
quelle vom benutzer

stimmen
9

Parenthesis Hölle? Ich sehe nicht mehr Klammer in:

(function toto)

als in:

function(toto);

Und in

(if tata (toto)
  (titi)
  (tutu))

nicht mehr als in:

if (tata)
  toto();
else
{
  titi();
  tutu();
}

Ich sehe weniger Klammern und ‚;‘ obwohl.

Beantwortet am 16/09/2008 um 17:23
quelle vom benutzer

stimmen
6

Ja, können Sie grundsätzlich die Syntax ändern, und sogar zu entkommen „um die Klammern Hölle“. Dafür benötigen Sie eine neue Leser Syntax zu definieren. Schauen Sie in Leser Makros.

Ich vermuten jedoch, dass das Niveau der Lisp Know-how zu erreichen solche Makros programmieren Sie sich in der Sprache so weit müssen einzutauchen, die Sie nicht mehr parenthese „Hölle“ in Betracht ziehen. Dh durch die Zeit wissen, wie sie zu vermeiden, werden Sie kommen, um sie als eine gute Sache zu akzeptieren.

Beantwortet am 15/09/2008 um 13:07
quelle vom benutzer

stimmen
2

finden Sie in diesem Beispiel, wie Leser Makros das Lispeln Leser mit komplexen Aufgaben wie XML Templating erweitern können:

http://common-lisp.net/project/cl-quasi-quote/present-class.html

Diese Anwenderbibliothek stellt die statischen Teile der XML - Daten in UTF-8 wörtlichen Byte - Arrays bei der Kompilierung codiert werden, die bereit sind , in den Netzwerk - Stream zu schreib sequence'd. und sie verwendbar in normalen Lisp - Makros sind, sind sie orthogonal ... die Platzierung der Kommazeichen Einflüsse , die Teile sind konstant und die sollten zur Laufzeit ausgewertet werden.

Weitere Informationen finden Sie unter: http://common-lisp.net/project/cl-quasi-quote/

Ein weiteres Projekt, für Common Lisp Syntaxerweiterungen: http://common-lisp.net/project/cl-syntax-sugar/

Beantwortet am 17/09/2008 um 01:30
quelle vom benutzer

stimmen
2

Wenn Sie lispeln wollen Ruby aussehen wie Ruby verwenden.

Es ist möglich, Rubin (und Python) in eine sehr Lispeln wie Art und Weise zu verwenden, die einer der Hauptgründe sind, dass sie die Annahme so schnell gewonnen haben.

Beantwortet am 05/08/2008 um 08:40
quelle vom benutzer

stimmen
1

Eine der Anwendungen von Makros, die meiner Meinung nach blies war die Kompilierung-Überprüfung von SQL-Anfragen gegen DB.

Sobald Sie erkennen Sie die volle Sprache zur Hand zur Compile-Zeit haben, öffnet es interessante neue Perspektiven. Was auch bedeutet, dass Sie sich in den Fuß in interessante neue Möglichkeiten schießen kann (wie Rendering-Kompilierung nicht reproduzierbar, was sehr leicht in eine Debug-Albtraum verwandeln kann).

Beantwortet am 19/09/2008 um 11:43
quelle vom benutzer

stimmen
1

Es ist eine schwierige Frage. Da Lisp bereits zu einem Parse-Baum strukturell so nahe ist der Unterschied zwischen einer großen Anzahl von Makros und Ihre eigene Mini-Sprache in einem Parser-Generator Implementierung ist nicht sehr klar. Aber mit Ausnahme der Öffnung und Schließung paren, könnte man sehr leicht am Ende mit etwas, das nichts wie Lisp aussieht.

Beantwortet am 06/08/2008 um 13:14
quelle vom benutzer

stimmen
1

@sparkes

Manchmal ist LISP die klare Sprache Wahl, nämlich Erweiterungen Emacs. Ich bin sicher, ich könnte Ruby-Emacs zu verlängern, wenn ich wollte, aber Emacs wurden entwickelt, um mit LISP erweitert werden, so scheint es sinnvoll, es in dieser Situation zu nutzen zu machen.

Beantwortet am 05/08/2008 um 08:45
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more