Diskussion:Closure (Funktion)

message: Habe zwei Änderungen vorgenommen:
1. Die Unterstützung von Closures ab JDK 7 steht derzeit noch nicht fest.
2. "Sun-Konzept zur Closure-Unterstützung ab Java 7". Neal Gafter arbeitet bei Google und Gilad Bracha ist auch nicht mehr bei Sun. Das Ganze ist also nicht wirklich ein Sun-Konzept.
--24.30.187.238 07:00, 29. Jan. 2007 (CET)
replies: text: Java 8 kann es jetzt.  In Java 7 kann man mit anonymen inneren Klassen und Interfaces wie Runnable auch recht gut Closures nachbauen, es ist nur mehr "noise" und dadurch weniger attraktiv.--Bk1 168 (D) 01:00, 21. Jun. 2014 (CEST)
thread_title:  Closures und Java 

message: Ach, an sich finde ich das Perl-Beispiel recht einleuchtend. Allerdings finde ich es etwas aufgebläht. Statt zweier Variablen und drei Methoden hätte eine Variable und je eine Getter- und Incremtentor-"Methode" auch genügt. Eigentlich finde ich das Python-Beispel viel besser. Dann spart man sich auch die if(0==0) - Blocks.
Der Perl-Code ist nur wenig geeignet, ein Programmierkonzept zu erklären. Man sollte sich lieber auf Python beschränken oder besser noch ein Beispiel in Ruby oder Scheme bringen. 194.114.62.65 08:08, 10. Jan. 2008 (CET)
thread_title:  Beispiel etwas lang 

message: Mir ist nicht so richtig klar, was man jetzt mit diesen Closures eigentlich machen soll. Das einzige Argument im Artikel ist Kapselung, aber das geht mit public/protected/private auch. 
: Die Erklärung im Artikel ist in meinen Augen auch nicht wirklich erhellend, aber aus dem Stegreif könnte ich auch nicht sagen, wie man es besser sagen sollte. Klassen und Closures sind in gewisser Hinsicht isomorph. Das wird manchmal umgangssprachlich in den folgenden beiden Formeln zusammengefasst: "objects are a poor man's closures," und "closures are a poor man's objects," siehe beispielsweise hier oder hier. Man kann Closures zur Implementierung von Objektsystemen verwenden, siehe beispielsweise Kapitel 3.1 in Structure and Interpretation of Computer Programs. Umgekehrt kann man in einer Programmiersprache mit Unterstützung für objektorientierte Programmierung auch Closures auch durch entsprechende Objekte realisieren. — Tobias Bergemann 09:15, 14. Sep. 2007 (CEST)
thread_title:  Sinn der Sache? 

message: Folgendes Beispiel ist meines Erachtens sinnvoller (python):
==== Motivation für das Beispiel ====
Ein Programm soll auf einer Liste eine Funktion anwenden.
Es wird zuerst eine Liste definiert, auf der diese Funktion angewendet werden soll:
>>> l=[2,3,4,4]
Auf alle Werte dieser Liste soll 3 hinzugezählt werden.
Für diesen Zweck definiere ich ein Closure bzw. eine anonyme Funktion:
>>> f=lambda n:n+3
Dieses Closure wird mit Hilfe der Funktion map auf der Liste angewendet:
>>> map(f,l)
[5, 6, 7, 7]
Die Funktion map erwartet als Argument eine Liste und ein Closure.
Die Besonderheit dieses Konzeptes ist also, dass man als Argument einer Funktion eine Funktion übergeben kann.
Die Implementierung der Funktion map lautet folgendermaßen:
def map(f,l):
    return [f(x) for x in l]
Der entscheidende Punkt an dieser Stelle ist, dass das Argument f eine Funktion ist, die innerhalb von Map aufgerufen wird.
Ein anderes Beispiel wäre ein Filter:
>>> f2=lambda n:n==4
>>>> filter(f2,l)
[4, 4]
==== Gegenüberstellung der Implementierung ohne Closures ====
In Java (bis 1.6) würde man für den gleichen Zweck erst ein Interface definieren und dann implementieren müssen.
Hier wird auch deutlich warum Closures auch anonyme Funktionen genannt werden.
Denn das Closure könnte ich direkt als Argument der Funktion übergeben, ohne dass es eine Klasse oder einen Namen hat:
map(lambda n:n+3, [1,2,3,4])
public interface Filter {
    public boolean filter(Object value);
}
public class FilterFour implements Filter {
    public boolean filter(Object value) {
        return Integer.parseInt(value)==4;
    }
}
public List<Object> filter(Filter filter, List<Object> list) {
   List<Object> result = new ArrayList<Object>();
   for (Object x:list) {
       if (filter.filter(x)) {
           result.append(x);
       }
   return result;
   }
}
// Aufruf
filter(new FilterFour(), mylist);
Anhand dieser Gegenüberstellung erschließt sich vielleicht, dass Closures für solche Zwecke deutlich eleganter sind.
Closures sind dann sinnvoll einzusetzen, wenn keine Daten gekapselt werden sollen, wie hier in der Filter-Klasse.
Denn dann ist die Definition eines Interfaces zuzüglich Klasse, aus der dann ein Objekt instantiiert wird, überdimensioniert,
da das Objekt ja nur der Träger einer einzelnen Funktion ist.
Wieso sollte ich diesen Aufwand betreiben, wenn ich nur eine einzelne Funktion benötige?
Genau an dieser Stelle kommt das Closure oder die anonyme Funktion, also eine Funktion ohne Träger-Klasse ins Spiel.
Wenn ich Daten kapseln möchte (wie dies im Beispiel auf der aktuellen Seite gezeigt wird), sollte ich tunlichst auch eine Klasse definieren.
Zur Diskussion:
Ich kenne das Konzept nur aus der Praxis (python, scheme/dsssl), aber nicht den theoretischen Kontext.
Die genaue Definition von Closure ist mir selber nicht klar und ich sehe zwischen der Definition auf der Java-Seite und der auf der englischen Wikipedia-Seite einen Widerspruch:
java-seite:  ... parameterized delayed-execution blocks of code, variously called lambda, anonymous functions, or closures.
Hier ist Closure das gleiche wie eine anonyme Funktion.
en-wikipedia:
In this example, the lambda expression (lambda (book) (>= (book-sales book) threshold)) appears within the function best-selling-books. When the lambda expression is evaluated, Scheme creates a closure consisting of the code for the lambda and a reference to the threshold variable, which is a free variable inside the lambda.
Hier wird aus einer Lambda-Funktion ein Closure (was auch immer das sein soll) erzeugt.
Wenn kein Widerspruch besteht würde ich das ganze (dann noch gescheit formatert) gerne in den Artikel übernehmen.
Ich würde aber auch vorschlagen, das andere Beispiel zu entfernen.
77.24.211.226 08:58, 17. Mai 2008 (CEST)
replies: text: Schön wäre es, wenn das Beispiel schon hier ordentlich formatiert werden würde, denn auch mir erschließt sich die Eleganz von Closures noch nicht. (Und untschreibt bitte mit den 4 Tilden, ist schöner.) 89.246.164.202 00:09, 17. Mai 2008 (CEST)
thread_title:  Beispiel 

message: In Java (bis 1.6) würde man für den gleichen Zweck erst ein Interface definieren und dann implementieren müssen.
Hier wird auch deutlich warum Closures auch anonyme Funktionen genannt werden.
Denn das Closure könnte ich direkt als Argument der Funktion übergeben, ohne dass es eine Klasse oder einen Namen hat:
map(lambda n:n+3, [1,2,3,4])
public interface Filter {
    public boolean filter(Object value);
}
public class FilterFour implements Filter {
    public boolean filter(Object value) {
        return Integer.parseInt(value)==4;
    }
}
public List<Object> filter(Filter filter, List<Object> list) {
   List<Object> result = new ArrayList<Object>();
   for (Object x:list) {
       if (filter.filter(x)) {
           result.append(x);
       }
   return result;
   }
}
// Aufruf
filter(new FilterFour(), mylist);
Anhand dieser Gegenüberstellung erschließt sich vielleicht, dass Closures für solche Zwecke deutlich eleganter sind.
Closures sind dann sinnvoll einzusetzen, wenn keine Daten gekapselt werden sollen, wie hier in der Filter-Klasse.
Denn dann ist die Definition eines Interfaces zuzüglich Klasse, aus der dann ein Objekt instantiiert wird, überdimensioniert,
da das Objekt ja nur der Träger einer einzelnen Funktion ist.
Wieso sollte ich diesen Aufwand betreiben, wenn ich nur eine einzelne Funktion benötige?
Genau an dieser Stelle kommt das Closure oder die anonyme Funktion, also eine Funktion ohne Träger-Klasse ins Spiel.
Wenn ich Daten kapseln möchte (wie dies im Beispiel auf der aktuellen Seite gezeigt wird), sollte ich tunlichst auch eine Klasse definieren.
Zur Diskussion:
Ich kenne das Konzept nur aus der Praxis (python, scheme/dsssl), aber nicht den theoretischen Kontext.
Die genaue Definition von Closure ist mir selber nicht klar und ich sehe zwischen der Definition auf der Java-Seite und der auf der englischen Wikipedia-Seite einen Widerspruch:
java-seite:  ... parameterized delayed-execution blocks of code, variously called lambda, anonymous functions, or closures.
Hier ist Closure das gleiche wie eine anonyme Funktion.
en-wikipedia:
In this example, the lambda expression (lambda (book) (>= (book-sales book) threshold)) appears within the function best-selling-books. When the lambda expression is evaluated, Scheme creates a closure consisting of the code for the lambda and a reference to the threshold variable, which is a free variable inside the lambda.
Hier wird aus einer Lambda-Funktion ein Closure (was auch immer das sein soll) erzeugt.
Wenn kein Widerspruch besteht würde ich das ganze (dann noch gescheit formatert) gerne in den Artikel übernehmen.
Ich würde aber auch vorschlagen, das andere Beispiel zu entfernen.
77.24.211.226 08:58, 17. Mai 2008 (CEST)
replies: text: Schön wäre es, wenn das Beispiel schon hier ordentlich formatiert werden würde, denn auch mir erschließt sich die Eleganz von Closures noch nicht. (Und untschreibt bitte mit den 4 Tilden, ist schöner.) 89.246.164.202 00:09, 17. Mai 2008 (CEST)
thread_title:  Gegenüberstellung der Implementierung ohne Closures 

message: Kann mich der Kritik bzgl. der vielen verschiedenen Programmiersprachen in den Beispielen nur anschließen.
Es wäre dringend notwendig den Artikel noch einmal zu überarbeiten.
Nicht-Programmierer haben meines erachtens nach gar keine Chance da irgend etwas verstehen zu können.
Im Artikel wird soweit ich das sehe auch nicht erwähnt in welcher Sprache der Beispiel-Code der ersten beiden Blöcke abgefasst ist.
Da ich selbst z.B. bisher weder mit Perl, Ruby, Python, PHP, Lua, Haskell, OCaml, Groovy, Smalltalk, Scheme, oder Lisp programmiert habe, kann da ehrlich gesagt im Moment nur raten (tippe mal auf Perl oder PHP für die ersten beiden Blöcke, das ist aber wirklich aus dem Bauch raus geraten - einfach wegen der Dollar Zeichen : )
Finde es prinzipiell ja schön Beispiele in möglichst vielen unterschiedlichen Sprachen anzubieten, aber es sollte vorher unbedingt erwähnt werden welche Sprache jetzt gerade konkret verwendet wird.
Toll wäre natürlich wenn man per Link auf ein Beispiel in der bevorzugten Sprache verweisen könnte (wär' schon 'ne Sache).
C/C++, Java, Visual Basic kennen/kannten dieses Konstrukt so bisher jedenfalls nicht, und da ich selbst z.B. aus dieser Gegend komme war ich erst mal wirklich erstaunt (und ein wenig peinlich berührt).
Natürlich favorisiert jeder seine persönlichen Vorlieben bzgl. der Programmiersprache, aus welchen Gründen auch immer, die Beispiele sollten aber gerade für Leser ohne Vorwissen leicht nachzuvollziehen sein.
Leser die sich bereits mit Sprachen auseinander setzen in denen Closures von anfang an angboten werden verfügen meist über ausführliche Referenzen, können diese auch verstehen, und müssen deshalb in der Regel nicht im Wikipedia nachschlagen.
Ich persönlich denke man solle auf alle Fälle wenigstens ein Beispiel mit Pseudocode anbieten.
Würde sich darüber hinaus z.B. nicht auch Javascript für ein Beispiel anbieten ?
Javascript ist jedenfalls wirklich weit verbreitet.
Weiß im Moment auch nicht in welchen Sprachen ausser C# in letzter Zeit Closures noch eingeführt wurden, aber solche Neuerungen wären meines erachtens auch erwähnenswert.
Auch hier könnte/sollte man vielleicht durch Verlinkung auf detailiertere Infos verweisen.
Trotzdem vielen Dank für den Artikel und die erläuternden Beiträge
: Du hast so recht!
: Die Beispiele sind m.E. ungeschickt gewählt, außer in Javascript (oder Lua), was von jedem gelesen werden kann, der schon einmal eine algoloide Sprache programmiert hat, kann es natürlich auch in C, Pascal, oder Java aufgezeigt werden, auch wenn der Code-Schnipsel dann kein gültiges Standard-C, -Pascal oder -Java ist.
: Es fehlt einfach auch an Grundlagenartikeln wie :en:Funarg problem und :en:Scope (programming).
: --Pjacobi 23:16, 16. Mär. 2009 (CET)
thread_title:  Programmiersprachen und Beispiele  

message: Ich habe eine – für das Verständnis meines Erachtens sehr hilfreiche – Erklärung lexikalischen Gültigkeitsbereichs, ausgehend vom dynamischen Skopus und der damit einhergehenden Problematik, angefügt. Durch sie kann der Leser den Sinn und die Beweggründe für lexikalische Gültigkeitsbereiche und lexikalische Closures besser verstehen.
Die Beispiele sind aus zweierlei Gründen in CL gehalten: Erstens bietet CL sowohl dynamischen als auch statischen Skopus, was für die Beispiele hilfreich ist. Zweitens sind Bindungen in Lisp visuell deutlich zu erkennen und der Gültigkeisbereich lexikalischer Variablen mithin auf den ersten Blick deutlich. Allein, ich war zu faul Quellen zu referenzieren, da ich das Ganze aus dem Kopf aufgeschrieben habe – die Beispiele können jedoch allesamt in der REPL nachvollzogen und die Quellen im HyperSpec nachgeschlagen und dann referenziert werden.
 (nicht signierter Beitrag von 217.226.215.112 (Diskussion | Beiträge) 19:19, 8. Okt. 2009 (CEST)
thread_title:  Erklärung dynamischen und lexikalischen Skopus als Grundlage für das Verständnis von Closures 

message: ...dort findet sich nämlich eine vernünftige und viel klarere Definition von Closures. Und der Zusammenhang mit anonymen Klassen ist dort auch gut geklärt. Was meint Ihr? Wenn es hier einige Positiv-Stimmen gibt, würde ich mich dazu bereiterklären, die Übersetzng zu machen.
:Tolle Idee!!! Am besten Du übersetzt ihn mal auf Deiner Benutzerseite (siehe dazu Wikipedia:Importwünsche um die History sicherzustellen), ergänzt ihn um etwaige brauchbare Abschnitte von hier und lässt dann von einem Administrator diesen Artikel durch Deinen ersetzen. Wennst Hilfe brauchst, unterstütze ich Dich gerne... --Sebastian.Dietrich  ✉ 18:00, 30. Okt. 2010 (CEST)
thread_title:  Wie wärs mit Übersetzen von wikipedia.org 

message: Hi. Ich würde gerne mal das Bsp. für die Sprache Go hierfür sehen. Kennt jemand zufällig den Aufbau. Angeblich soll sie das ja können. Noch bin ich aber nicht fündig geworden. :-( 67.202.78.161 23:59, 26. Aug. 2012 (CEST)
thread_title:  Go Lang Bspw? 

message: Der letzte Edit stimmt mich nachdenklich. Dort wird gesagt . Ich kenne aber auch Closures, die nicht zwingend in einer anderen Funktion stehen müssen,siehe hier. --Nightfly | Disk 14:55, 8. Mai 2013 (CEST)
replies: text: Die übliche Vorgehensweise dürften zwei verschachtelte Funktionen sein, auch die Beispiele zielen darauf ab. Vielleicht "Erreicht wird dies beispielsweise durch zwei verschachtelte Funktionen..."? --Mocha (Diskussion) 09:39, 10. Mai 2013 (CEST)
replies: text: Wer sagt denn, welches die "übliche" Vorgehenswise ist? Eine Definition macht doch nur dann Sinn, wenn sie allgemein gültig ist. Es ist keine direkte Kritik an dich bzw. euch, ich möchte nur verstehen, warum ein Closure sich zwischen den Programmiersprachen so unterschiedlich verhält.. --Nightfly | Disk 12:13, 10. Mai 2013 (CEST)
replies: text: Üblich: So hat es in den 70ern begonnen. Mittlerweile kommen Closures auch in Sprachen vor, die nicht a priori dafür vorbereitet wurden, also in Sprachen, wo Funktionen nicht wie normale Variablen (bzw. Objekte) behandelt werden können ("Funktion höherer Ordnung"). Daher die Unterschiede. --Mocha (Diskussion) 22:47, 10. Mai 2013 (CEST)
thread_title:  Letzter Edit: Korrekte Definition? 

message: Ist das von Interesse?  Es scheint einige Beschreibungen im Internet zu geben, z.B. 
* http://brodowsky.it-sky.net/2014/06/20/closures-in-c/
* https://gist.github.com/vidarh/259462
--Bk1 168 (D) 01:03, 21. Jun. 2014 (CEST)
thread_title:  Closures in C 

message: – GiftBot (Diskussion) 13:31, 2. Dez. 2015 (CET)
thread_title:  {{Anker|deadurl_2015-10}} Defekter Weblink 

message: In Ada gibt es keine Closure, auch wenn der Einzelnachweis auf eine Abhandlung verweist, wo "Closure" in der Überschrift steht. Ada erlaubt es, (mit dem access-Attribut) typsicher einen Zeiger auf ein Objekt zu benutzen, das auf dem Stapel steht (lokale Variable). Dabei erfolgt eine Prüfung spätestens zur Laufzeit, die gewährleistet, dass die Variable, die den Zeiger aufnimmt, keine längere Lebensdauer hat als das Objekt auf das der Zeiger zeigt. Dasselbe gilt auch für einen Zeiger auf ein lokales Unterprogramm. Der Versuch, eine Closure zu machen, führt also zu einer Fehlermeldung.
Ada stammt aus den 80er Jahren, als Computer noch viel langsamer waren. Daher wird großen Wert auf Effizienz gelegt und wegen der schnelleren Speicherverwaltung so viel wie möglich auf dem Stapel statt auf heap/pool gespeichert. Closures passen nicht zu dieser Philosophe.
Bigben.in (Diskussion) 10:08, 12. Jan. 2017 (CET)
thread_title:  Closure in Ada