Was ist eine Lambda-Sprache?

88

Ich habe "JavaScript: The Good Parts" gelesen und der Autor erwähnt, dass JavaScript die erste Lambda-Sprache ist, die gestartet wird.

Die Funktionen von JavaScript sind erstklassige Objekte mit (meistens) lexikalischem Umfang. JavaScript ist die erste Lambda-Sprache , die zum Mainstream wird. Im Grunde hat JavaScript mehr mit Lisp und Scheme gemeinsam als mit Java. Es ist Lisp in Cs Kleidung. Dies macht JavaScript zu einer bemerkenswert leistungsfähigen Sprache.

Ich habe keine Lambda-Sprache verstanden. Was sind die Eigenschaften einer solchen Sprache und wie unterscheidet sie sich von Sprachen wie Java, C, C ++ und Php?

Sushil Bharwani
quelle
6
Lambda bedeutet anonymer Ausdruck. Also Lambda-Sprache -> Sprache mit anonymen Ausdrücken
Bevacqua
Google Books Link, FYI: books.google.co.uk/…
Lucas Jones
3
Siehe Lambda-Kalkül auf Wikipedia.
Oded
viele gute Antworten. Was ich bei weitem verstanden habe ist, wenn Sie eine anonyme Funktion verwenden, dann arbeiten Sie an der Lambda-Sprache. ist das richtige Verständnis, wie unterschiedlich Lamda-Sprachen von Sprache wie Java sind.
Sushil Bharwani
4
"Ich habe 'JavaScript: The Good Parts' gelesen und der Autor erwähnt, dass JavaScript die erste Lambda-Sprache ist, die eingeführt wird." Also googelte ich Lambda-Sprache und fand diese Frage auf SO :)
Bugs Bunny

Antworten:

38

Ich habe noch nie gehört, dass jemand den Begriff "Lambda-Sprache" verwendet, und die einzigen plausiblen Definitionen, die ich mir vorstellen kann, würden JavaScript als "die erste" ausschließen.

Das heißt, ich vermute, er kann entweder bedeuten:

  • Funktionssprachen: Eine Klasse von Sprachen, in denen die Berechnung als zustandslose Zusammensetzung von Funktionen (möglicherweise höherer Ordnung) modelliert wird (oder werden kann). LISP, Schema, ML, Haskell usw. werden häufig dieser Klasse zugeordnet, obwohl einige davon besser gemischte Paradigmen oder "funktionale optionale" Sprachen sind. Javascript enthält wohl die notwendigen Funktionen, um einen "funktionalen Programmierstil" zu ermöglichen.
  • Sprachen, die die Erstellung anonymer Funktionen ermöglichen (unter Verwendung der functionSyntax in JavaScript; diese ist lambdain vielen Sprachen geschrieben, daher möglicherweise "Lambda-Sprachen".

Beide Verwendungen leiten sich aus der Verwendung des griechischen Buchstabens Lambda ab, um die Funktionsabstraktion im Lambda-Kalkül zu bezeichnen, dem von Alonzo Church entwickelten Berechnungsmodell, auf dem die funktionale Programmierung basiert.

Bearbeiten: sah sich das Ergebnis von Google Books an --- "first to go Mainstream"; Nun, das ist fraglich. Ich würde behaupten, dass LISP an einem Punkt zumindest einigermaßen Mainstream war. Es ist jedoch ein fairer Punkt, die Semantik von JavaScript ist direkt vom Schema inspiriert und hat sicherlich ein größeres Publikum erreicht als jede andere Sprache, die ähnliche Behauptungen aufstellen kann.

Derrick Turk
quelle
Bitte beachten Sie den Link von Lucas Jones Google-Buch-Link, über den er genau zu der Seite gelangt, über die ich spreche. Danke für deine Antwort.
Sushil Bharwani
5
Der Grund, warum JavaScript als "der Erste" beschrieben wird, liegt darin, dass die Anweisung mit "To Go Mainstream" qualifiziert ist. Ich denke, es ist ziemlich klar, dass JavaScript tatsächlich die erste funktionale Sprache ist, die von alltäglichen Programmierern bei alltäglichen Jobs verwendet wird.
Rfunduk
1
Was meinst du, wenn du "funktionaler Stil" der Programmiersprache sagst? Ich habe einen Java-Hintergrund und versuche, Javascript zu lernen, wie es anders ist.
Sushil Bharwani
9
Es ist ein großes Thema zu erkunden. Letztes Jahr war ich dort, wo Sie jetzt sind: Ich hatte Crockfords Aufsätze und Vorträge gefunden und wollte Verschlüsse verstehen. Ich würde empfehlen, dass Sie mit Wikipedia beginnen und dann mit einigen Aufsätzen fortfahren : John Hughes "Why Functional Programming Matters" scribd.com/doc/26902/whyfp , Slava Akhmechet "Functional Programming for the rest of us" defmacro.org/ramblings /fp.html Es gibt eine Fülle von Büchern, mit denen Sie Ihre Gedanken erweitern können: Schauen Sie sich das kleine Schema an, um ein Gefühl für das Schema zu bekommen, und fahren Sie dann mit der Struktur und Interpretation von Computerprogrammen fort.
michiakig
5
@sushil: Es gibt viel einführende Literatur zu diesem Thema. Im Allgemeinen handelt es sich jedoch um einen Programmierstil, bei dem die Behandlung von Programmen als mathematische Objekte und nicht als sequentielle Anweisungen oder Interaktionen zwischen abstrakten Objekten im Vordergrund steht. Beispielsweise bevorzugen funktionale Sprachen die Rekursion gegenüber der Iteration, verwenden unveränderliche Datenstrukturen und verwenden Funktionen höherer Ordnung gegenüber "Funktionsobjekten" oder "Strategiemustern". Funktionen höherer Ordnung sind Funktionen, die Funktionen ausführen (als Argumente) oder andere Funktionen (als Rückgabewerte) liefern können.
Derrick Turk
48

Eine Lambda-Sprache ist in einfachen Worten eine Sprache, mit der eine Funktion an eine andere Funktion übergeben werden kann, wobei die Funktion wie jede andere Variable behandelt wird. Außerdem sollten Sie in der Lage sein, diese Funktion so zu definieren, dass sie anonym (oder inline) übergeben wird. PHP 5.3 fügte Unterstützung für Lambda-Funktionen hinzu. War JavaScript die erste Mainstream-Sprache? Lisp wurde häufig in Lernumgebungen vor JavaScript und auch beim Anpassen unserer geliebten Emacs verwendet. Http://www.gnu.org/software/emacs/manual/html_node/eintr/

Hier ist ein Beispiel

function applyOperation(a, b, operation) {
  return operation(a,b);
}

function add(a,b) { return a+ b; }
function subtract(a,b) {return a - b;}

// Can be called like
applyOperation(1,2, add);
applyOperation(4,5, subtract);
// Anonymous inline function
applyOperation(4,7, function(a,b) {return a * b})

Wie unterscheidet es sich von C? In C können Sie Zeiger auf Funktionen übergeben, diese jedoch nicht anonym inline definieren.

In Java (vor Version 8) müssen Sie ein Objekt übergeben, das eine Schnittstelle implementiert, die tatsächlich anonym inline definiert werden kann, um den gleichen Effekt zu erzielen.

Juan Mendes
quelle
1
"Lisp wurde weit verbreitet" von wem? Ich habe es immer gewusst, da Professoren immer darüber diskutierten, aber in der Praxis habe ich nie jemanden getroffen, der Lisp benutzt hat. Ich würde sagen, dass jeder jemanden finden könnte, den er kennt und der Javascript verwendet hat, was Javascript viel "Mainstream" macht.
Palswim
"PHP 5 hat Unterstützung für Lambda-Funktionen hinzugefügt". Eigentlich war PHP 5.3, das Lambda-Funktionen einführte.
Crozin
Ich habe nur wenige Leute getroffen, die es in einem geschäftlichen Kontext verwendet haben, aber wie Pascal es früher war, ist es in Bildungseinrichtungen weit verbreitet.
Juan Mendes
4

Er bezieht sich auf Lambda-Kalkül .

Der Lambda-Kalkül, auch als λ-Kalkül geschrieben, ist ein formales System zur Funktionsdefinition, Funktionsanwendung und Rekursion. [...]

[...] wobei untypisierte Lambda-Berechnungen die ursprüngliche Inspiration für die funktionale Programmierung sind, insbesondere Lisp, und typisierte Lambda-Berechnungen als Grundlage für moderne Typensysteme dienen.

BenoitParis
quelle
4

Ich habe ein Lambda gesehen, das als anonyme Funktion und als Referenz auf eine Funktion definiert ist. Javascript unterstützt beide:

setTimeout(function(){ /* an anonymous function */ }, 100)

var f = function(){ /* function ref */ }

Hier bekommt JS viel von seiner Kraft und Flexibilität. Java unterstützt die erste bis zu einem gewissen Grad (anonyme Schnittstellenimplementierungen), nicht jedoch die letztere - siehe unten für das Update für Java 8.

Mir ist unklar, welches (oder beide) davon die richtige Definition eines Lambda ist.

JS ist definitiv nicht die erste Sprache, die diese Funktionen unterstützt. Aus dem Gedächtnis heraus denke ich, dass Sprachbegeisterte immer davon schwärmen, Lambdas zu unterstützen.

Übrigens: In Java wird normalerweise eine anonyme Klasse verwendet, um eine Klassendefinition im laufenden Betrieb für ein Argument zu übergeben (häufig in Swing verwendet). So etwas (aus dem Gedächtnis, nicht kompiliert):

someGuiContainer(new WidgetInterface()
      {
           public void importantMethodToDefine(){
             // Handle having the method called in my special widget way
           }
        }
)

Aktualisieren

Java ist ab 8 offiziell eine Lambda-Sprache.

Sie können jetzt die folgende Syntax verwenden:

MathOperation addition = (int a, int b) -> a + b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));

Codequelle

mtyson
quelle
1

In der offenen Kursware des MIT wurde Struktur und Interpretation von Computerprogrammen als Buch von Hal Abelson, Jerry Sussman und Julie Sussman bezeichnet. Sie diskutieren das Schema, das ein Dialekt von LISP ist, und erklären dort eine sehr detaillierte und klare Erklärung dessen, was Lambda ist, sowie das Schema LISP und die Sprachen im Allgemeinen. Ich empfehle Ihnen dringend, sich das anzuschauen, wenn Sie ein wirklich klares und tiefes Verständnis der Computerprogrammierung haben möchten. Ihnen zu erklären würde dreimal so viel Zeit in Anspruch nehmen, als ob Sie dorthin gegangen wären und einfach das Buch gelesen oder die Tutorials angesehen hätten, die es perfekt erklären, es ist genial.

Javascript basiert hauptsächlich auf dem Sprachschema und ist Lisp-Vater. Außerdem hat es seine Lamda-Struktur übernommen und sich damit etabliert.

Max
quelle
0

Aus Wikipedia: In Programmiersprachen wie Lisp und Python ist Lambda ein Operator, mit dem anonyme Funktionen oder Abschlüsse nach Verwendung der Lambda-Rechnung bezeichnet werden. Ein Beispiel für diese Verwendung von Lambda in der Python-Sprache ist dieser Abschnitt des Computercodes, der eine Liste alphabetisch nach dem letzten Zeichen jedes Eintrags sortiert:

>>> list = ['woman', 'man', 'horse', 'boat', 'plane', 'dog']
>>> sorted(list, key=lambda word: word[-1])
['horse', 'plane', 'dog', 'woman', 'man', 'boat']

* In the C# programming language a lambda expression is an anonymous function that can contain expressions and statements
r3nrut
quelle
0
  • Mit JavaScript können Sie eine anonyme Funktion definieren, die nicht an einen Bezeichner gebunden ist. Eine solche Funktion wird auch als Lambda-Abstraktion bezeichnet, und da JS dies unterstützt, wird sie als Lambda-Sprache bezeichnet.

  • Eigenschaften: Diese Funktion wird für die sofortige Ausführung einer Funktion oder für die kurzfristige Verwendung benötigt, wenn es keine Bedeutung hat, der Funktion einen Namen zu geben.

  • Es unterscheidet sich von Sprachen wie Java, C, C ++ und PHP, da in JS Anonymous-Funktionen für Closure und Currying verwendet werden.

MERLIN THOMAS
quelle