Wie kann ich 'bekommen' Lisp?
Habe ich gelesen Die Natur von Lisp. Das einzige, was ich wirklich bekam, war "code-Daten." Aber ohne zu definieren, was diese Begriffe bedeuten und warum sind Sie in der Regel gedacht, um eine separate, Gewinne ich keine Erkenntnis. Meine erste Reaktion auf "code data" ist, so what?
- Von Zeit zu Zeit stoße ich auf tiefen Fragen über die Programmierung auf StackOverflow, die geschlossen sind, weil Sie Fragen, "wird tendenziell fast ausschließlich auf die Meinungen." Ich denke, in vielen Fällen, diese Eigenschaft ist ein feature, kein bug.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schreiben Lisp-code. Der einzige Weg, um wirklich 'get' Lisp (oder jeder anderen Sprache, für diese Angelegenheit) ist, die ärmel hochkrempeln und mit der Umsetzung einiger Dinge. Wie alles andere können Sie Lesen, wie Sie wollen, aber wenn Sie wollen, um wirklich einen festen Griff auf, was Los ist, hast du zu Schritt außerhalb der theoretischen und arbeiten mit dem praktischen.
Dem altmodischen Ansicht: "es ist interaktive Berechnung mit symbolischen Ausdrücken.
Lisp ermöglicht einfache Darstellung aller Arten von Ausdrücken:
englischen Satz
Mathematik
Regeln
und auch Lisp sich
und viele viele viele mehr.
Lisp erlaubt es nun, Programme zu schreiben, berechnen Sie mit solchen Ausdrücken:
Interaktiv bedeutet, dass Programmierung ist der dialog mit Lisp. Geben Sie einen Ausdruck und Lisp berechnet die Nebenwirkungen (z.B. Ausgang) und dem Wert.
Damit Ihr programming-session ist wie 'reden' mit dem Lisp-system. Sie arbeiten, bis Sie die richtigen Antworten.
Was sind das für Ausdrücke? Sie sind Sätze in einigen Sprachen. Sie sind Teil der Beschreibungen von Turbinen. Sie sind Theoreme beschreiben, eine floating-point-Motor von einem AMD-Prozessor. Sind Sie ein computer-algebra-Ausdrücke in der Physik. Sie sind Beschreibungen der schaltungen. Sie Regeln in einem Spiel. Sie sind Beschreibungen des Verhaltens von Akteuren in spielen. Sie sind Regeln, die in einem medizinischen Diagnose-system.
Lisp erlaubt Ihnen zu notieren, Fakten, Regeln, Formeln als symbolische Ausdrücke. Es erlaubt Ihnen, Programme zu schreiben, die Arbeit mit diesen Ausdrücken. Sie können die Berechnung des Wertes einer Formel. Sie können aber ebenso einfach Programme geschrieben werden, berechnen von neuen Formeln aus Formeln (symbolische Mathematik: Integration, Ableitung, ...). Das war Lisp entwickelt wurde.
Als Nebeneffekt Lisp-Programme sind vertreten, wie solche Ausdrücke zu. Dann gibt es auch ein Lisp-Programm, das wertet oder kompiliert, andere Lisp-Programme. So sehr die Idee von Lisp, die Berechnung mit symbolischen Ausdrücken, die angewendet wurde, um Lisp selbst. Lisp-Programme sind symbolische Ausdrücke, und die Berechnung ist ein Lisp-Ausdruck.
Alan Kay (der Smalltalk fame) ruft die ursprüngliche definition von Lisp evaluation in Lisp die Maxwell-Gleichungen der Programmierung.
So, wie Sie "bekommen" jegliche Sprache ist, indem Sie versuchen, code zu schreiben in it.
Über die "Daten-code", was in den meisten Sprachen gibt es eine klare Trennung zwischen dem code, der ausgeführt wird, und die Daten, die verarbeitet werden.
Zum Beispiel die folgende einfache C-artige Funktion:
den tatsächlichen Kontrollfluss bestimmt wird einmal statisch, während das schreiben von code. Die Funktion
bar
ist nicht zu ändern, und die if-Anweisung am Anfang der Funktion wird nicht verschwinden. Dieser code ist nicht Daten, es kann nicht manipuliert werden, durch das Programm.Alle, die manipuliert werden können, ist der anfängliche Wert
i
. Und auf der anderen Seite, der Wert kann nicht ausgeführt werden, der code kann. Sie können die Funktion aufrufenfoo
, aber Sie können nicht nennen Sie die variablei
. Soi
Daten, aber es ist nicht code.Lisp nicht diese Unterscheidung. Der Programm-code ist Daten, die manipuliert werden können, zu. Kann code, zur Laufzeit, nehmen die Funktion
foo
, und vielleicht fügen Sie eine weitere if-Anweisung, vielleicht ändern Sie die Bedingung in der for-Schleife, vielleicht ersetzen Sie den Aufrufbaz
mit einer anderen Funktion aufrufen. Dein code ist Daten, die kontrolliert und manipuliert so einfach wie die oben beschriebene Funktion können Sie überprüfen und Bearbeiten die ganze Zahli
.Ich würde empfehlen,Struktur und Interpretation von Computerprogrammen, die tatsächlich verwendet ein Schema, aber das ist ein Dialekt von lisp. Es wird Ihnen helfen, "get", lisp, indem Sie viele verschiedene übungen und geht auf zu zeigen, einige der Möglichkeiten, die lisp ist so nützlich.
Ich glaube, Sie haben mehr Empathie für die compiler-Autoren zu verstehen, wie grundlegend der code ist Daten Sache ist. Ich gebe zu, ich habe nie einen Compiler natürlich, aber bei der Umwandlung ausreichend high-level-Sprache in Maschinencode ist ein schwieriges problem, und LISP, die in vielerlei Hinsicht ähnelt ein Zwischenschritt in diesem Prozess. In der gleichen Weise, dass C "nahe am Metall", LISP liegt in der Nähe der compiler.
Dieser arbeitete für mich:
Lesen "Der Kleine Verbrecher". Es ist der kürzeste Weg, um Sie denken in der Lisp-Modus (ohne Makros). Als bonus, es ist relativ kurz/fun/preiswert.
Finden, ein gutes Buch/tutorial, um Ihnen den Einstieg mit Makros. Ich fand Sie in Kapitel 8 von "Das Schema
Programmier-Sprache" zu sein, ein guter Ausgangspunkt für das Schema.
http://www.ccs.neu.edu/home/matthias/BTLS/
http://www.scheme.com/tspl3/syntax.html
Durch die Beobachtung legendären Struktur und Interpretation von Computerprogrammen?
In Common Lisp, "code data" läuft darauf hinaus, diese. Wenn Sie schreiben, zum Beispiel:
Ihre Lisp-system, analysieren, der text und erstellen Sie eine Liste mit drei Elementen: dem symbol HINZUFÜGEN, und die zahlen 1 und 2. So, jetzt sind Sie Daten. Sie können tun, was Sie wollen mit Ihnen, ersetzen Sie Elemente, setzen Sie andere Sachen, etc.
Den Spaß Teil ist, dass Sie übergeben diese Daten an den compiler und können, da Sie die Manipulation dieser Datenstrukturen mit Lisp selbst, das heißt, Sie können Programme schreiben, die schreiben andere Programme. Dies ist nicht so kompliziert, wie es klingt, und Lispers tun es die ganze Zeit über Makros. So, nur ein Buch über Lisp, und probieren Sie es aus.
Okay, ich nehme einen Riss an diesen. Ich bin neu in Lisp mich, gerade angekommen aus der Welt von python. Ich habe nicht erlebt, dass die plötzlichen moment der Erleuchtung, dass alle alten Lispers reden, aber ich werde Ihnen sagen, was ich sehe so weit.
Ersten, Blick auf diese random-bit-python-code:
Nun schau mal hier:
Was tun Sie, als Programmierer zu finden? Der code ist identisch, FYI.
Wenn Sie wie ich sind, werden Sie dazu neigen zu denken, der zunächst als aktiver code. Es besteht aus einer Anzahl von syntaktischen Elementen.
Den zweiten, trotz Ihrer ähnlichkeit, ist eine einzelne syntaktische Element. Es ist ein string. Interagieren Sie mit es als eine Einheit. Umgang mit es als code - to-handle es sich bequem entlang seiner syntaktischen Grenzen - Sie haben zu tun, einige analysieren. Um es auszuführen, müssen Sie zum aufrufen eines Dolmetschers. Es ist nicht die gleiche Sache überhaupt als die erste.
So, wenn wir die code-Generierung in den meisten Sprachen, was haben wir es zu tun? Strings. Wenn ich HTML oder SQL mit python verwende ich python-Zeichenketten als Schnittstelle zwischen den beiden Sprachen. Auch wenn ich generieren python mit python-strings sind das Werkzeug.*
Nicht der Gedanke, dass gerade die... machen Lust vor Freude zu tanzen? Es gibt immer dieses groteske Missverhältnis zwischen dem, was Sie arbeiten und was Sie arbeiten. Ich spürte, dass das erste mal, dass ich die generierte SQL mit perl. Unterschiede in der Flucht. Unterschiede in der Formatierung: denken Sie versuchen, ein html-Dokument zu suchen ordentlich. Zeug ist nicht einfach wiederverwenden. Etc.
Um das problem zu lösen, die wir Seriell erstellen von Template-Bibliotheken. Unmengen von Ihnen. Warum so viele? Meine Vermutung ist, dass Sie nie ganz befriedigend. Durch die Zeit, die Sie beginnen immer mächtig genug, haben Sie sich in Monstrositäten. Zugegeben, manche von Ihnen - wie SQLAlchemy und Genshi in der python-Welt - sind sehr schön und bewundernswert Monstrositäten. Wir... ähm... vermeiden Sie die Erwähnung von PHP.
Weil die Streicher machen eine schwierige Schnittstelle zwischen dem arbeitete-auf die Sprache und die be-mit, wir erstellen eine Dritte Sprache - Vorlagen - zu vermeiden. ** Dies ist auch eher ein wenig unbeholfen.
Schauen wir uns jetzt an einem block notiert Lisp code:
Was sehen Sie? Als einen neuen Lisp-coder, habe ich gefangen mich, an, die als string. Das ist es nicht. Es ist inaktiv Lisp-code. Sie sind auf der Suche auf eine Reihe von Listen und Symbole. Versuchen Sie, es zu bewerten, nachdem Sie eine der Klammern. Die Sprache wird nicht lassen Sie es tun: syntax erzwungen wird.
Mit quasiquote, wir können Schuhlöffel unsere eigenen Werte in diese inaktiv Lisp code:
Hinweis: die Art der shoehorning: ein Element wurde durch eine andere ersetzt. Wir sind nicht die Formatierung unserer Wert in eine Zeichenfolge. Wir gleiten in einem Schlitz in den code. Es ist alles sauber und ordentlich.
In der Tat, wenn Sie wollen, direkt den text Bearbeiten, der code, die Sie in eine Schlägerei. Zum Beispiel, wenn Sie einfügen-name <varname> in den code, und Sie wollen auch zu verwenden <varname>-tmp in den gleichen code können Sie es nicht direkt wie kann man mit einem template-string: "%s-tmp = %s". Sie haben zum extrahieren der Namen in einen string schreiben string, dann verwandeln Sie es in ein symbol wieder, und schließlich einfügen.
Wenn Sie möchten, um zu begreifen, das Wesen des Lisp, ich denke, dass Sie gewinnen mehr durch das ignorieren defmacro und gensyms und alle, die window-dressing für den moment. Verbringen Sie einige Zeit zu erforschen, das Potenzial der quasiquote, einschließlich die, die@ Sache. Es ist ziemlich zugänglich. Defmacro selbst bietet nur eine einfache Möglichkeit zum ausführen der Folge von quasiquotes. ***
Was Sie beachten sollten, ist, dass die hermetische string/Vorlage Barriere zwischen die gearbeitet-und die arbeitete-mit alle, aber beseitigt in Lisp. Wie Sie es verwenden, werden Sie feststellen, dass Sie Ihren Sinn aus zwei verschiedenen Schichten - aktive und passive - neigt zu zerstreuen. Funktionen aufrufen Makros aufrufen-Makros oder Funktionen, die Funktionen (und Makros!) übergeben, die Ihre Argumente. Es ist eine Art big-Suppe - ein wenig schockierend für die newcomer. Das heißt, ich finde nicht, dass die Unterscheidung zwischen Makros und Funktionen sind so nahtlos wie einige Lisp-Leute sagen. Meistens ist es ok, aber jeder so oft, wie ich Wandern in die Suppe, ich finde mich stoßen sich gegen den Geist des alten Barriere - und es wirklich creeps me out!
Ich werde darüber hinwegkommen, da bin ich sicher. Egal. Die Bequemlichkeit zahlt für die Angst.
Nun, das ist Lisp arbeiten auf Lisp. Was ist mit arbeiten auf anderen Sprachen? Ich bin noch nicht ganz dort, persönlich, aber ich glaube, ich sehe Licht am Ende des Tunnels. Sie wissen, wie die Lisp-Leute weiter über die S-Ausdrücke, die dasselbe sind, wie der parse-Baum? Ich finde die Idee zu analysieren, die Fremdsprache in die S-Ausdrücke, die Arbeit, die Sie in die erstaunlichen Komfort der Lisp-Umgebung, dann senden Sie zurück zu native code. In der Theorie, jede Sprache gibt, könnte verwandelt werden in S-Ausdrücke, oder sogar ausführbare Datei lisp-code. Du bist nicht der Arbeit in einem ersten Sprache in Kombination mit einer Dritten Sprache zu erzeugen code, in einer zweiten Sprache. Es ist alles, während Sie arbeiten auf Sie - Lisp, und Sie können generieren Sie alle mit quasiquotes.
Haben Sie einen Blick auf diese (entlehnt aus PCL):
Sieht aus wie eine S-expression als HTML-version, nicht wahr? Ich habe das Gefühl, dass Lisp funktioniert Prima als eigene Template-Bibliothek.
Habe ich begonnen, mich zu Fragen, eine S-expression-version von python. Würde es sich als ein Lisp? Es wäre durchaus nicht Common Lisp. Vielleicht wäre es schöner - für python-Programmierer zumindest. Hey, und was ist mit P-Ausdrücke?
* Python hat jetzt etwas AST genannt, die ich noch nicht erforscht. Auch eine person konnte mithilfe von python-Listen zu vertreten, andere Sprachen. Relativ zu Lisp, vermute ich, dass beide ein bisschen ein hack.
** SQLAlchemy ist irgendwie eine Ausnahme. Es ist einen netten job zu drehen, SQL direkt in python. Das sagte, es scheint, haben die beteiligten einen erheblichen Aufwand.
*** Nehmen Sie es von einem Neuling. Ich bin mir sicher, dass ich gern über etwas hier. Auch merke ich, dass quasiquote ist nicht der einzige Weg, um code zu generieren, für die Makros. Es ist sicherlich ein nettes, aber.
Daten code ist ein Interessantes Paradigma, das unterstützt die Behandlung einer Datenstruktur, die als ein Befehl. Die Behandlung von Daten ermöglicht, Sie zu verarbeiten und zu manipulieren die Struktur in verschiedener Hinsicht - z.B. traversal - von der Bewertung von it. Darüber hinaus werden die "Daten-code" Paradigma erspart in vielen Fällen zu entwickeln, die benutzerdefinierte Parser für die Daten-Strukturen; die Sprache parser selbst kann verwendet werden, um eine Analyse der Strukturen.
Der erste Schritt ist, zu vergessen alles, was Sie gelernt haben, mit allen C-und Pascal-ähnliche Sprachen. Leeren Sie Ihren Geist. Dies ist der schwierigste Schritt.
Dann nehmen Sie eine gute Einführung in die Programmierung verwendet Lisp. Versuchen Sie nicht, zu korrelieren, was Sie sehen mit allem, was Sie wissen vorher, (wenn Sie ertappt sich dabei, dass, wiederholen Sie Schritt 1). Ich mochte die Struktur und Interpretation von Computerprogrammen (Schema verwendet), Practical Common Lisp, Paradigms of Artificial Intelligence Programming, Casting Spels in Lisp, unter anderem. Werden Sie sicher, dass Sie schreiben die Beispiele. Auch versuchen Sie die übungen an, sondern beschränken Sie sich auf die Konstrukte, die Sie gelernt haben, in diesem Buch. Wenn Sie sich selbst zu finden versuchen zu finden, zum Beispiel, eine Funktion, eine variable oder einige Aussage, die in etwa eine
for
- Schleife, wiederholen Sie Schritt 1, dann überdenken Sie die Kapitel vor, um herauszufinden, wie es gemacht wird in Lisp.Lesen und zu verstehen, die legendäre Seite 13 der Lisp 1.5 Programmer ' s Manual
Laut Alan Kay, mindestens.
Einer der Gründe, dass einige Uni-computer science-Programme verwenden Lisp für Ihre intro-Kursen ist, dass es grundsätzlich zutreffend, dass ein Anfänger kann lernen, funktionalen, prozeduralen oder Objekt-orientierten Programmierung mehr oder weniger gleich gut. Jedoch, es ist viel schwieriger für jemanden, der denkt bereits in prozeduralen Anweisungen, um zu beginnen zu denken wie eine funktionale Programmierer, als das umgekehrte.
Als ich versuchte, abholen, Lisp, ich habe es "mit einem C-Akzent."
set!
amdbegin
waren meine Freunde und ständige Begleiter. Es ist erstaunlich einfach zu schreiben, der Lisp-code, ohne jemals schriftlich keine funktionalen code, das ist nicht der Punkt.Können Sie feststellen, dass bin ich nicht, deine Frage zu beantworten, was wahr ist. Ich wollte nur lassen Sie wissen, dass es ist furchtbar schwer, um Ihren Verstand zu denken, die in einem funktionalen Stil, und es wäre eine spannende übung, die Sie machen eine stärkere Programmierer im langen Lauf.
Kampai!
P. S. Auch werden Sie endlich verstehen, dass "meine anderen Auto ist ein cdr" Aufkleber.
Wirklich grok lisp, die Sie brauchen, um es zu schreiben.
Lieben lernen
car
,cdr
, undcons
. Nicht Durchlaufen, wenn man Rekursion. Beginnen Sie mit dem schreiben einige einfache Programme (Fakultät, Liste Umkehr, dictionary lookup), und arbeiten Sie Ihren Weg bis zu komplexeren (Sortieren von Gruppen der Elemente, pattern-matching).Auf der code-Daten und die Daten code-Sache, ich würde nicht sorgen über die es an dieser Stelle. Sie verstehen es irgendwann, und es ist nicht entscheidend für das lernen lisp.
Ich würde vorschlagen, Check-out einige der neueren Varianten von Lisp wie Arc oder Clojure. Sie bereinigen die syntax ein wenig und sind kleiner und somit leichter zu verstehen als Common Lisp. Clojure wäre meine Wahl. Es ist geschrieben auf der JVM und damit Sie nicht haben Probleme mit verschiedenen Plattform-Implementierungen und-Bibliothek Unterstützung, die vorhanden ist mit einigen Lisp-Implementierungen wie SBCL.
Lesen Auf Lisp und Paradigmen der Künstlichen Intelligenz, der Programmierung. Beide haben hervorragende Abdeckung der Lisp-Makros - die wirklich machen, der code ist Daten Konzept echte.
Auch beim schreiben Lisp, nicht Durchlaufen wenn Sie die Parameter recurse oder Karte (lieben lernen mapcar).
ist es wichtig zu sehen, dass die Daten-code-UND code ist Daten. Dies nährt die eval/apply-Schleife. Rekursion ist auch Spaß.
(Dieser link ist gebrochen:
)
Ich würde vorschlagen, dass ist eine schreckliche Einführung in die Sprache. Es gibt bessere Orte, um zu starten und die Menschen besser/Artikel/Bücher als die, die Sie zitiert.
Sind Sie ein Programmierer? Welche Sprache(N)?
Helfen Sie mit Ihrer Frage, mehr hintergrund könnte hilfreich sein.
Über die ganze "code data" - Sache:
Nicht, dass aufgrund der "von-Neumann-Architektur"? Wenn code und Daten befanden sich auf physikalisch getrennte Speicherbereiche, die bits in die Daten Speicher konnte nicht ausgeführt werden, in der Erwägung, dass die bits im Programmspeicher konnte nicht interpretiert werden als nichts, aber die Anweisungen an die CPU.
Verstehe ich das richtig?
eval
oder als einen großen string von bytes. In Lisp source-code gespeichert ist (und für Sie zugänglich) als Listen von Objekten. Sie können die Liste Bearbeiten von Funktionen zu Durchlaufen und zu transformieren und generieren von source-code sehr einfach. Können Sie Makros schreiben, die nehmen einige source-code und zurück, andere-source-code für compiler/interpreter. Sie kann zaubern auf diese Weise.Ich denke, etwas zu lernen, Sie haben einen Zweck, für Sie, wie ein einfaches Projekt.
Für Lisp, eine gute einfaches Projekt ist eine symbolische differenzierer, so zum Beispiel
dann müssen Sie ein simplificateur, wie
also, wenn Sie beginnen mit einem mathematischen Ausdruck, können Sie die eval es, um seinen Wert, und Sie können eval seine Ableitung zu, um seine Ableitung.
Ich hoffe, das veranschaulicht, was passieren kann, wenn der Programmcode manipuliert Programm-code.
Wie Marvin Minsky beobachtet, computer-Mathematik ist immer besorgt über Genauigkeit und roundoff error, richtig? Nun, das ist entweder genau richtig oder komplett falsch!
Können Sie bekommen LISP in vielerlei Hinsicht, am häufigsten durch die Verwendung von Emacs arbeiten, oder neben jemanden, entwickelte LISP schon.
Traurig, wenn Sie sich einmal LISP, ist es schwer, es loszuwerden, Antibiotika wirken nicht.
BTW: ich empfehle auch Die Abenteuer eines Pythonista in Schemeland.
Dieser hilfreich sein kann: http://www.defmacro.org/ramblings/fp.html (nicht über LISP, sondern über die funktionale Programmierung als Paradigma)
So denke ich darüber, dass der beste Teil von "code data" ist das Gesicht, die Funktion sind gut, funktional nicht anders als die anderen Variablen. Die Tatsache, dass Sie können code schreiben, der schreibt code ist eine der mächtigsten (und oft übersehen) features von Lisp. Funktionen annehmen können andere Funktionen als Parameter, und sogar wieder Funktionen als Ergebnis.
Diese können einen code auf einer viel höheren Ebene der Abstraktion als, sagen wir, Java. Es macht viele Aufgaben, die elegante und präzise, und deshalb ist der code leichter zu ändern, zu warten und zu Lesen, oder zumindest in der Theorie.
Ich würde sagen, dass der einzige Weg, um wirklich zu "bekommen" Lisp ist zu verbringen eine Menge Zeit mit ihm-sobald Sie den Dreh raus haben, werden Sie wünschte, Sie hatten einige der features von Lisp in den anderen Programmiersprachen.