Ich habe dieses Wochenende angefangen, mich ernsthaft mit Lisp zu beschäftigen (womit ich meine, dass ich nur Lisp gelernt habe und nicht zu Projekten in C # zurückgekehrt bin) und muss sagen, dass ich es liebe. Ich habe mich mit anderen funktionalen Sprachen (F #, Haskell, Erlang) beschäftigt, aber die Auslosung, die Lisp mir gegeben hat, nicht gespürt.
Jetzt, da ich weiterhin Lisp lerne, frage ich mich, warum nicht funktionierende Sprachen keine erstklassigen Funktionen unterstützen. Ich weiß, dass Sprachen wie C # ähnliche Aufgaben mit Delegaten ausführen können und dass Sie in gewissem Umfang Zeiger auf Funktionen in C / C ++ verwenden können. Gibt es jedoch einen Grund, warum dies in diesen Sprachen niemals zu einer Funktion werden würde? Gibt es einen Nachteil, wenn man Funktionen erstklassig macht? Für mich ist es äußerst nützlich, daher weiß ich nicht, warum mehr Sprachen (außerhalb des Funktionsparadigmas) es nicht implementieren.
[Bearbeiten] Ich schätze die bisherigen Antworten. Da mir gezeigt wurde, dass viele Sprachen jetzt erstklassige Funktionen unterstützen, werde ich die Frage neu formulieren: Warum würde es so lange dauern, bis Sprachen sie implementieren? [/Bearbeiten]
Antworten:
C #, VB.NET, Python, JavaScript, jetzt bietet sogar C ++ 0x erstklassige Funktionen.
Aktualisieren:
Eine Implementierung von Verschlüssen erfordert Lambda-Lifting - eine Technik, die den imperativen Programmierern ursprünglich recht fremd war. Für ordnungsgemäße erstklassige Funktionen (einschließlich Schließungen) ist zumindest eine gewisse Unterstützung durch die Laufzeit und die VM erforderlich. Es dauerte auch einige Zeit, um die alten Funktionstechniken in die imperative Welt zu übernehmen.
Und das Wichtigste: Erstklassige Funktionen können kaum verwendet werden, wenn keine Speicherbereinigung vorhanden ist. Es wurde erst kürzlich mit Java und folglich mit .NET in eine Massenprogrammierung eingeführt. Und der ursprüngliche Java-Ansatz bestand darin, die Sprache zu stark zu vereinfachen, um sie für die durchschnittlichen Programmierer verständlich zu halten. .NET folgte zuerst und trennte sich erst kürzlich von dieser (meiner Meinung nach rechtfertigten und angemessenen) Richtung.
All diese Konzepte brauchen Zeit, um von der Industrie verarbeitet zu werden.
quelle
Erstklassige Funktionen sind ohne Verschlüsse viel weniger interessant.
Schließungen sind ohne eine dynamische Verwaltung des Gültigkeitsbereichs (Garbage Collection) nicht wirklich möglich. Eines der Dinge, die C / C ++ so leistungsfähig machen, ist die Tatsache, dass es viel einfacher ist, eine Sprache zu kompilieren, in der Sie den Speicher manuell verwalten, sodass C / C ++ irgendwie aus der Gleichung herausgenommen wird.
Und dann ja, da ist die Frage der OOP-Auswirkungen. Sie haben keine Trennung mehr von Methoden und Eigenschaften. Methoden sind selbst Eigenschaften, die Funktionen als Werte akzeptieren. Was bedeutet es in diesem Zusammenhang wirklich, Methoden zu überladen, da Sie die dummen Dinge jederzeit einfach austauschen können? Können Sie das zum Beispiel wirklich zu Java hinzufügen, ohne einen großen Paradigmenwechsel in der gesamten Sprache einzuführen? Woher kommt der Vertrag oder das Gefühl der (IMO-falschen) Sicherheit, wenn Menschen wissen, dass das Konstrukt garantiert, dass es jedes Mal auf die gleiche Weise funktioniert? Es mag sinnvoll sein, an Objekte gebundene Funktionen als Methoden als einen anderen Organismus in Sprachen zu behandeln, die es Funktionen ermöglichten, unabhängig voneinander zu existieren, aber in Java ist dies eigentlich keine Option.
In JavaScript sind OOP und Funktionalität sehr eng miteinander verbunden, und ich persönlich würde es schwierig finden, erstklassige Funktionen in Sprachen, in denen sie nicht vorhanden waren, als alles andere als angeschraubt zu sehen. Dies erfordert jedoch eine Reihe anderer Paradigmenwechsel, einschließlich eines hohen Maßes an Veränderlichkeit in Objekten und ihren Methoden selbst sowie die Fähigkeit, Funktionen aufzurufen, als wären sie Mitglieder eines Objekts im laufenden Betrieb.
Sprachen sind nicht nur Tool-Sets voller Do-Hickeys, um die Dinge größtenteils zu erledigen. Das sind Paradigmen. Bündel von Ideen, Strategien und Meinungen, die alle auf eine Weise zusammenpassen, die miteinander verbunden ist (oder verbunden zu sein scheint). In vielen Fällen passen Funktionen wie Substantiv und Verb wirklich überhaupt nicht zum Paradigma oder sind bestenfalls unvollständig.
Trotzdem habe ich das Gefühl, dass mir ein Arm fehlt, wenn ich gezwungen bin, ohne sie zu codieren.
quelle
Das ist nicht wirklich unmöglich. Aber es ist noch eine weitere Funktion, und das Komplexitätsbudget ist begrenzt. Es kann vom Sprachdesigner als unnötig angesehen werden (oder auch nicht in den Sinn kommen) - "Warum zum Teufel müssten wir Funktionen weitergeben? Diese Sprache dient zum Programmieren eines Betriebssystems!". Es kann auch erhebliche Anstrengungen erfordern, um mit dem Rest der Sprache zu verschmelzen. Zum Beispiel kann ein Funktionstyp ernsthafte Ergänzungen des Typsystems erfordern (z. B. in Java), noch mehr, wenn Sie überladen sind (danke @Renesis für den Hinweis). Sie müssen auch einen Bibliothekscode bereitstellen, um das Lebensfähige nutzen zu können - niemand möchte sich
map
selbst definieren .Es könnte auch schwieriger werden, andere Ziele der Sprache zu erreichen:
f
niemals neu zugewiesen werden, bevor Sie sie inline setzen.Ebenso kann man sich fragen, warum eine Programmiersprache L1 kein Merkmal F der sehr unterschiedlichen Sprache L2 hat.
quelle
Ich denke, das erste Problem ist ein Missverständnis, dass objektorientiert und funktional nicht gemischt werden können. Eine kurze Liste der Sprachen, die zumindest von Wikipedia als beides beschrieben werden: JavaScript , ActionScript , Python , C # , F # .
Das zweite Problem scheint eine Definition erstklassiger Funktionen zu sein - warum betrachten Sie C # beispielsweise nicht als solche?
Ich bin kein Experte für funktionale Sprachen. Bitte korrigieren Sie mich in den Kommentaren, wenn ich falsch liege. Mein Verständnis ist jedoch, dass die Einbeziehung erstklassiger Funktionen selbst mehr oder weniger definiert, ob eine Sprache ein funktionales Paradigma unterstützt .
Was ist die eigentliche Frage?
So, die objektorientierte Verständnis Sprachen kann auch funktional sein, und diese Sprachen enthalten erstklassige Funktionen, es klingt wie die Frage nach dem Sie suchen sind warum einige objektorientierten Sprachen nicht First-Class - Funktionen enthalten?
Funktionsüberladung
Einer der Hauptgründe dafür ist die Schwierigkeit, erstklassige Funktionen zu definieren, wenn die Sprache auch die Funktionsüberladung unterstützt (Beispiel in Java):
Auf welche
dispatchEvent
Funktion würde sich eine Variable beziehen?Klassenbasierte Programmierung
Klassenbasierte Programmierung hindert eine Sprache nicht daran, erstklassige Objekte zu unterstützen, kann sie jedoch verwirrender machen oder zu beantwortende Fragen hinzufügen.
ActionScript zum Beispiel als ECMAScript-Sprache begann in einem viel funktionaleren Paradigma wie JavaScript. Funktionen waren nicht von Natur aus an Objekte gebunden, sondern konnten im Wesentlichen mit jedem Objekt aufgerufen werden, da es zum Zeitpunkt der Ausführung den Gültigkeitsbereich hatte.
Wenn Sie (nicht dynamische) Klassen hinzufügen, verfügen Sie über Funktionen, die von Natur aus an eine Instanz gebunden sind , nicht nur an die Klasse selbst. Dies wirft ein paar Falten in die Spezifikation
Function.apply
, die ich ehrlich gesagt nicht untersucht habe, um herauszufinden, wie sie damit umgegangen sind.quelle
Ich habe mich das gleiche gefragt. Sobald ich in einer Sprache mit Lambdas bin, benutze ich sie VIEL. Sogar PHP wird besser, wenn Sie feststellen, dass Sie mit PHP 5.3 einen Abschluss machen können (es ist nicht so schön wie Lisp, aber immer noch besser).
quelle