Frage

Ich habe viel gelesen, dass LISP neu definieren können syntax-on-the-fly, vermutlich mit Makros.Ich bin gespannt, wie weit geht das eigentlich gehen?Können Sie neu definieren, die Struktur der Sprache so sehr, dass es grenzwertig wird ein compiler für eine andere Sprache?Für Beispiel, Sie könnte ändern die funktionale Natur von LISP in eine objektorientierte syntax und Semantik, vielleicht sagen, dass die syntax näher an etwas wie Ruby?

Vor allem, ist es möglich, um loszuwerden, die Klammer Hölle mit Makros?Ich habe genug gelernt (Emacs-)LISP zum anpassen von Emacs mit meinen eigenen micro-features, aber ich bin sehr gespannt, wie weit kann man Makros gehen Sie im customizing der Sprache.

War es hilfreich?

Lösung

Das ist eine wirklich gute Frage.

Ich denke, es ist nuanciert aber definitiv vertreten:

Makros werden nicht stecken in s-Ausdrücke.Finden Sie das LOOP-makro für eine sehr komplexe Sprache geschrieben, mit keywords (Symbole).So, während Sie kann Anfang und Ende der Schleife mit Klammern, innen hat es eine eigene syntax.

Beispiel:

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

Dass gesagt wird, die meisten einfache Makros benutzen Sie einfach die s-Ausdrücke.Und wären Sie "stecken", die Sie verwenden.

Aber s-Ausdrücke, wie Sergio beantwortet hat, beginnen Sie zu fühlen.Die syntax aus dem Weg bekommt und Sie mit dem Programmieren beginnen, die in der syntax-Baum.

Wie für Adobe reader-Makros, ja, Sie könnte unter Umständen etwas schreiben wie diese:

#R{
      ruby.code.goes.here
  }

Aber würden Sie brauchen, um schreiben Ihre eigenen Ruby-syntax-parser.

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

#B(some lisp (code goes here))

würde übersetzen

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

Finden diese Seite wie es zu tun.

Andere Tipps

Ja, Sie können definieren die syntax, so dass Lisp wird ein compiler.Tun Sie dies mit der "Reader-Makros", die sind verschiedene von der normalen "Compiler-Makros", dass Sie wahrscheinlich denken.

Common Lisp hat die gebaut-in Anlage neu zu definieren syntax für den reader und die reader-Makros, um Prozess, der syntax.Diese Verarbeitung erfolgt auf lese-Zeit (was kommt vor dem kompilieren oder eval-Zeit).Erfahren Sie mehr über die Definition reader-Makros in Common Lisp, siehe Common Lisp Hyperspec-Sie werden Lesen wollen Ch.2, "Syntax" und Ch.23, "Leser".(Ich glaube, die Regelung ist die gleiche Anlage, aber ich bin nicht so vertraut mit es-siehe die Schema Quellen für die Arc Programmiersprache).

Als ein einfaches Beispiel, nehmen wir an, Sie möchten Lisp zu verwenden geschweifte Klammern anstelle von Klammern.Dies erfordert so etwas wie der folgende 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 #\( #\[ )

Du erzählst Lisp, dass das { wie eine ( und dass das } ist wie a ).Dann erstellen Sie eine Funktion (lcurly-brace-reader), dass der Leser rufen, Wann immer es sieht, a {, und verwenden Sie set-macro-character zuweisen der Funktion auf {.Dann Sie sagen, Lisp, (und ) wie [ und ] (, dass ist, keine sinnvolle syntax).

Andere Dinge, die Sie tun könnten, zählen zum Beispiel erstellen Sie einen neuen string-syntax oder unter Verwendung der [- und ] zu legen-fix-notation und Verfahren in S-Ausdrücke.

Sie können auch gehen weit darüber hinaus, die Neudefinition der gesamten syntax mit eigenen makro-Zeichen, die die Aktionen auslösen, in dem Leser, so die sky wirklich ist die limit.Dies ist nur einer der Gründe, warum Paul Graham und andere immer wieder sagen, dass Lisp ist eine gute Sprache, in der das schreiben eines Compilers.

Ich bin kein Lisp-Experte, was solls ich bin nicht einmal ein Lisp-Programmierer, aber nach ein wenig Experimentieren mit der Sprache kam ich zu dem Schluss, dass nach einer Weile die Klammer beginnen immer "unsichtbar", und Sie sehen den code, wie Sie wollen, es zu sein.Sie beginnen, mehr Aufmerksamkeit auf die syntaktische Konstrukte erstellen Sie mit der s-exprs und Makros, und weniger die der lexikalischen form den text von Listen und Klammer.

Dies gilt besonders, wenn Sie nehmen Sie einen guten editor, der hilft, mit den Einrückungen und die syntax-Einfärbung (versuchen Sie, die Klammern, um eine Farbe, die sehr ähnlich wie der hintergrund).

Sie sind möglicherweise nicht in der Lage zu ersetzen Sie die Sprache ganz und get 'Ruby' - syntax, aber Sie brauchen es nicht.Dank der Sprache die Flexibilität, die Sie könnten am Ende mit einem Dialekt, die sich wie Sie nach der "Ruby style-Programmierung', wenn Sie möchten, was auch immer das für Sie bedeutet.

Ich weiß, das ist nur eine empirische Beobachtung, aber ich denke, ich hatte eines dieser Lisp Aufklärung Momente, in denen ich dies erkannt.

Immer und immer wieder Neuankömmlinge zu Lisp wollen ", loszuwerden, alle die Klammer." Es dauert ein paar Wochen.Kein Projekt, um eine ernsthafte Allzweck-Programmiersprache, die oben auf dem üblichen S-expression-parser bekommt überall, weil die Programmierer immer wind-up lieber, was Sie derzeit wahrnehmen, als "Klammer die Hölle." Es dauert ein wenig gewöhnungsbedürftig, aber nicht viel!Sobald Sie erhalten verwendet, um es, und Sie können wirklich schätzen die Plastizität der Standard-syntax, geht zurück auf Sprachen, wo es gibt nur einen Weg zu äussern jeweiligen Programmierung zu konstruieren ist wirklich Gitter.

Dass gesagt wird, die Lisp ist ein ausgezeichnetes Substrat für building Domain Specific Languages.Ebenso gut wie, wenn nicht sogar besser als XML.

Viel Glück!

Die beste Erklärung, die von Lisp-Makros, die ich jemals gesehen ist im

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

ab etwa 55 Minuten.Dies ist ein video von einem Vortrag von Peter Seibel, den Autor von "Practical Common Lisp", das ist die beste Lisp-lehrbuch gibt es.

Die motivation für Lisp-Makros ist in der Regel schwer zu erklären, weil Sie wirklich kommen in Ihre eigenen in Situationen, die sind zu lang, um in eine einfache Anleitung.Peter kommt auf eine tolle Beispiel;können Sie begreifen es vollständig, und es macht den guten, den richtigen Gebrauch von Lisp-Makros.

Sie fragte:"könnten Sie ändern die funktionale Natur von LISP in eine objektorientierte syntax und Semantik".Die Antwort ist ja.In der Tat, Lisp ursprünglich hatten keine Objekt-orientierte Programmierung überhaupt nicht überraschend, da Lisp ist schon Weg, bevor die objektorientierte Programmierung!Aber wenn wir zum ersten mal gelernt, OOP in 1978, wir waren in der Lage, um es in Lisp einfach, mithilfe von, unter anderem, Makros.Schließlich wird das Common Lisp Object System (CLOS) entwickelt wurde, eine sehr leistungsfähige objektorientierte Programmierung system, dass fügt sich elegant in Lisp.Das ganze kann auch geladen werden, wie eine Erweiterung -- nichts ist gebaut-in!Es ist alles mit Makros.

Lisp hat eine ganz andere Funktion, als "reader-Makros", die verwendet werden können zu verlängern die Oberfläche syntax der Sprache.Mit reader-Makros, die Sie machen können subsprachen, die C-oder Ruby-like syntax.Transformieren Sie den text in Lisp, intern.Diese sind nicht weit von den meisten echten Lisp-Programmierer, vor allem weil es schwer ist, verlängern Sie die interaktive Umgebung für die Entwicklung zu verstehen, die neue syntax.Für Beispiel, Einrückung Emacs-Befehle werden würde verwirrt durch eine neue syntax.Wenn Sie energisch, wenn Emacs ist der erweiterbare zu, und Sie könnte lehren Sie über Ihre neue lexikalische syntax.

Regelmäßige Makros, die auf Listen von Objekten.Am häufigsten sind diese Objekte sind anderen Listen (so bilden Bäume) und Symbole, aber Sie können auch andere Objekte wie strings, hashtables, user-defined objects, etc.Diese Strukturen werden als s-exps.

Also, wenn Sie laden Sie eine Quelle Datei, Ihre Lisp-compiler analysiert den text und produzieren s-exps.Makros über diese.Dies funktioniert großartig und es ist eine wunderbare Weise zu erweitern, die Sprache in den Geist der s-exps.

Darüber hinaus werden die oben genannten Prozess analysieren kann erweitert werden durch "reader-Makros", mit denen Sie anpassen, wie Ihre compiler wandelt text in s-exps.Ich empfehle jedoch, dass Sie umarmen Lisp-syntax anstelle von biegen es in etwas anderes.

Sie Klang ein bisschen verwirrt, wenn Sie erwähnen, Lisp ' s "funktioneller Natur" und Ruby ' s "object-oriented syntax".Ich bin mir nicht sicher, was "Objekt-orientierte syntax" sein soll, aber Lisp ist eine multi-Paradigma-Sprache und unterstützt Objekt-orientierte Programmierung extremelly gut.

BTW, wenn ich sage, Lisp, ich meine Common Lisp.

Ich schlage vor, Sie legen Ihre Vorurteile Weg und geben Lisp eine ehrliche gehen.

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

(function toto)

als in:

function(toto);

Und in

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

nicht mehr als:

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

Ich sehe weniger Klammern und ';', obwohl.

Was Sie Fragen, ist ein wenig wie zu Fragen, wie ein Experte chocolatier, so dass Sie können entfernen Sie alles, höllische braune Zeug aus Ihren Lieblings-Schokoladen-Kuchen.

Ja, Sie können sich grundlegend ändern die syntax, und auch die Flucht "die Klammern Hölle".Für Sie benötigt wird, definieren Sie einen neuen Leser syntax.Schauen Sie in reader-Makros.

Mache ich vermute jedoch, dass zu erreichen die Ebene von Lisp-know-how, um das Programm Makros, die Sie benötigen, um in die Sprache einzutauchen, um einem solchen Ausmaß, dass Sie nicht länger als Klammer der "Hölle".I. e.durch die Zeit, Sie wissen, wie man Sie vermeiden kann, Sie kommen, Sie zu akzeptieren als eine gute Sache.

Wenn Sie möchten, lisp zu schauen, wie Ruby verwenden, Ruby.

Es ist möglich, Ruby und Python) in einem sehr lisp wie Weg, das ist einer der Hauptgründe, warum Sie gewonnen haben, die Akzeptanz so schnell.

finden Sie in diesem Beispiel, wie die Leser Makros können verlängern die lisp-Leser mit komplexen Aufgaben, wie das XML-Template:

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

diese Anwender-Bibliothek erstellt die statischen Teile der XML-Datei in UTF-8 codiert literal byte-arrays zur compile-Zeit, die bereit sind, zu schreiben-Sequenz würde in den Netzwerk-stream.und Sie sind einsetzbar in normalen lisp-Makros, Sie sind orthogonal...die Platzierung der Komma Einflüsse, die Teile sind konstant und die zur Laufzeit ausgewertet.

mehr details unter: http://common-lisp.net/project/cl-quasi-quote/

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

@sparkes

Manchmal LISP ist die klare Sprache, nämlich Emacs extensions.Ich bin sicher, ich könnte mit Ruby zu erweitern, Emacs, wenn ich wollte, aber Emacs wurde entwickelt, um sein erweitert mit LISP, so scheint es Sinn zu machen zu verwenden es in, dass situation.

Es ist eine knifflige Frage.Da lisp ist bereits strukturell so nahe an einem parse-Baum, der Unterschied zwischen eine große Anzahl von Makros und die Umsetzung Ihrer eigenen mini-Sprache, in ein parser-generator ist nicht ganz klar.Aber, außer für die öffnende und schließende Klammer, könnte man sehr leicht am Ende mit etwas, das aussieht nichts wie lisp.

Eine Verwendung der Makros, die blies mein Geist war der compile-Zeit überprüfung von SQL-Anfragen an die DB.

Sobald Sie erkennen, haben Sie die volle Sprache zur compile-Zeit, es eröffnet interessante neue Perspektiven.Das bedeutet auch, können Sie Schießen sich in den Fuß in der interessanten neuen Möglichkeiten (wie das rendering Zusammenstellung nicht reproduzierbar, kann sehr leicht in eine debugging-Alptraum).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top