Was soll ich aus dem Programm lernen?


10

Ich habe mich gefragt, welche einzigartigen Funktionen ich aus Scheme lernen kann, um ein besserer Programmierer zu werden.

Ich habe viel Erfahrung in Mainstream-Sprachen und möchte meinen Horizont erweitern und etwas über funktionale Aspekte lernen, die in anderen Sprachen fehlen. Ich bin mit Verschlüssen aus Javascript, Lambda-Ausdrücken aus C # vertraut und habe mich gefragt, worauf ich mich konzentrieren kann, was in anderen Sprachen fehlt. Abgesehen von der Lisp-Syntax habe ich das Gefühl, was ich bisher in anderen Sprachen gesehen habe.

Was ist einzigartig an Scheme / Lisp, das mir etwas Neues beibringen wird?


3
Es lohnt sich, Lisp für die tiefgreifende Erleuchtungserfahrung zu lernen, die Sie haben werden, wenn Sie es endlich bekommen. Diese Erfahrung macht Sie für den Rest Ihrer Tage zu einem besseren Programmierer, auch wenn Sie Lisp selbst nie häufig verwenden. - Eric Raymond
Robert Harvey


1
@ Robert Harvery: Auch: xkcd.com/224
Poindexter

2
In der aktuellen Form ist diese Frage nicht besonders konstruktiv. Wenn Sie es überarbeiten können, um genauere Informationen anzufordern, kann es nützlich sein.
ChrisF

Siehe auch Unterrichten von Programmiersprachen in einem post-linnäischen Zeitalter und das Lehrbuch, auf das in diesem Artikel verwiesen wird: Programmiersprachen: Anwendung und Interpretation , wobei die Racket-Sprache , ein Dialekt des Schemas, verwendet wird.
Robert Harvey

Antworten:


7

Das vielleicht wichtigste definierende Merkmal von Lisp ist "Code as Data".  Sie werden diese Erfahrung mit keiner anderen Sprache auf die gleiche Weise machen. In C # sind Expressionsbäume das nächste Analogon.

Es ist diese Qualität, die Lisp zu einer hervorragenden Sprache für das Parsen macht. Es ist auch die Qualität, die Paul Graham dazu motiviert hat, über Lisp zu sagen: "Das Ungewöhnliche an Lisp - in der Tat die definierende Qualität von Lisp - ist, dass es in sich selbst geschrieben werden kann." Selbsthosting-Compiler sind zwar nichts Neues, aber keine Sprache macht es so elegant wie Lisp.

Metaprogrammierung (etwas, in dem sich Lisp auch auszeichnet) ist ebenfalls eine lohnende Sache zu lernen.

Die Durchschnittswerte übertreffen von Paul Graham
http://www.paulgraham.com/avg.html


1
Ich denke, der Grund, warum ich dieses "Aha" nie hatte! Der Moment, den ESR mir versprach, war, dass ich bereits die Offenbarung "Code als Daten" in Prolog hatte.
Frank Shearar

1
Hat Haskell das Attribut "Code als Daten"? Oder hängt die Schönheit stark von dynamischer Eingabe und Reflexion ab?
Joey Adams

1
@Joey: Ich denke, die Tatsache, dass Template Haskell existiert, bedeutet, dass Haskell das Attribut "Code als Daten" fehlt.
j_random_hacker

4

Ja, es wird Ihnen helfen, rekursiv zu denken. Ich habe es nur ungefähr einen Monat lang in einem Programmiersprachenkurs studiert (Schema) und es hat mir geholfen, meine Denkweise weiterzuentwickeln und Programmierprobleme zu lösen.

Es ist immer wertvoll, andere Programmierparadigmen auszuprobieren. Sie kehren dann erfrischt mit neuen Ideen in die OO-Welt zurück.

Nicht die Syntax, sondern die Argumentation, es ist eine großartige Gehirnübung. Abgesehen von der Rekursion und der interessanten Verwendung von Listen gibt es meiner Meinung nach nicht viel anderes, aber es lohnt sich.


Nicht nur für das Schema. Jede (na ja, fast jede) funktionale Sprache eignet sich für die Ausübung der Rekursion.

Ich stimme zu, aber das OP scheint an Scheme im Vergleich zu "Mainstream" -Sprachen interessiert zu sein ...
Xavier Nodet

1

Fortsetzung :

In der Informatik und Programmierung ist eine Fortsetzung eine abstrakte Darstellung des Steuerzustands eines Computerprogramms. Eine Fortsetzung bestätigt den Programmsteuerungsstatus, dh die Fortsetzung ist eine Datenstruktur, die den Rechenprozess an einem bestimmten Punkt in der Ausführung des Prozesses darstellt. Auf die erstellte Datenstruktur kann von der Programmiersprache zugegriffen werden, anstatt in der Laufzeitumgebung versteckt zu sein. Es enthält Informationen wie den aktuellen Stapel des Prozesses (einschließlich aller Daten, deren Lebensdauer innerhalb des Prozesses liegt, z. B. "lokale Variablen") sowie den Prozesspunkt in der Berechnung. Eine Instanz der Fortsetzung kann später als Kontrollstruktur verwendet werden. Beim Aufruf wird die Ausführung von dem Kontrollpunkt, den es darstellt, fortgesetzt. Die "aktuelle Fortsetzung"

und versuchen Sie dann, McCarthys Ambiguous Operator zu implementieren :

1963 veröffentlichte John McCarthy, der Erfinder von Lisp, die Arbeit A Basis for a Mathematical Theory of Computation, in der er die Funktion amb (.,.) Vorschlug (im Sinne des Computerprogramms). Die Idee ist, dass amb (x, y) zuerst gleich x ist. Wenn sich jedoch später in der Berechnung herausstellt, dass dies zu einem Widerspruch führt, wird der Wert von x zurückgezogen und durch y ersetzt. Dies ist ein viel komplexeres Geschäft, als es zunächst scheinen mag. Das Zurückziehen eines Wertes bedeutet im Wesentlichen, den gesamten Zustand der Berechnung auf den Stand zurückzusetzen, an dem amb den Wert x zurückgegeben hat, und dann den Wert von y einzugeben. Dies bedeutet, dass der gesamte Status eingefroren und kopiert wird, als x zum ersten Mal zurückgegeben wurde. Wenn ein Widerspruch gefunden wird, wird der gesamte Status des Programms verworfen und durch die eingefrorene Version ersetzt, die reaktiviert wird. Diese eingefrorenen Zustände werden als Fortsetzungen bezeichnet. In vielerlei Hinsicht ist es wie eine GOTO-Aussage über Säure. Dies kann einen Sprung zu einer beliebigen Stelle in Ihrem Code verursachen. Aber Fortsetzungen sind schöner als GOTOs, weil sie für logisches Denken besser geeignet sind.


1

Ich kann mir Folgendes vorstellen:

  • Echte Makros (mit der vollen Kraft der Sprache, um Code zu generieren)
  • Homoikonizität (Daten als Code, Code als Daten)
  • Faule Bewertung
  • Fortsetzung

Ich denke auch, dass Lisp-Sprachen großartig sein sollten, um domänenspezifische Sprachen (DSL) zu definieren. Das ist etwas, worüber Sie vielleicht lesen möchten, wenn Sie es noch nicht wissen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.