Diskussion:Anonyme Funktion
Wertende Aussage; Lambda-Abstraktion
Bearbeiten1) Die Bemerkung ueber C und C++ ist rein wertend und sollte gestrichen werden. 2) Wenn schon die (konzeptuell eigentlich ziemlich anders gearteten) anonymen Klassen erwaehnt werden, dann muessen erst recht auch die (tatsaechlich als Funktionen zu bezeichnenden) Lambda-Abstraktionen genannt werden. --FAR 06:53, 7. Dez 2005 (CET)
- Lambda-Abstraktionen, die Variante kannte ich noch nicht. Wenn der Begriff geläufig ist, brauchen wir vielleicht einen entsprechenden Eintrag als Umleitung zur Lambda-Funktion (derzeit eine Begriffsklärung, weil zunächst ihrerseits eine Umleitung zum Lambda-Kalkül. --Tobias 15:09, 2. Aug. 2007 (CEST)
- Die Werturteile in Bezug auf C/C++ hab ich mal durch Fakten ersetzt, bitte sichten und/oder ohne Werturteile selbst schreiben. (nicht signierter Beitrag von 88.66.147.223 (Diskussion | Beiträge) 09:30, 26. Aug. 2009 (CEST))
Perl-Beispiele
BearbeitenKann bitte jemand die Beispiele ins Deutsche übersetzen (nicht nur Kommentare, sondern möglichst auch Bezeichner)? Vielleicht kann sie ja auch jemand durch Beispiele in einer leichter nachvollziehbaren Programmiersprache ersetzen. --Head 19:15, 10. Apr. 2007 (CEST)
- schonmal ein Querverweis: siehe Lambda-Funktion (Python) --Tobias 14:53, 2. Aug. 2007 (CEST)
- Hallo Head, habe die Beispiele mal eingedeutscht. Grüße --k00ni 10:30, 27. Aug. 2008 (CEST)
Name des Lemmas
BearbeitenIch weiß nicht, ob es Bedarf für anonyme Subroutinen gibt, die keine Funktionen sind (nach meinem von Pascal geprägten Verständnis: eine Funktion zeichnet sich dadurch aus, daß ihr Zweck ist, einen Wert zurückzugeben). Ich finde deshalb für das hier behandelte die Bezeichnung anonyme Funktion treffender. Kein Python-Programmierer würde z.B. eine Lambda-Funktion (Python) als Subroutine bezeichnen.
Als ich feststellte, daß es noch keinen Artikel Lambda-Funktion gab, war anonyme Funktion eine Umleitung auf anonyme Subroutine. Leider ist das Verständnis einer Funktion quer durch die Programmiersprachen uneinheitlich (was hier bisher noch nirgends übersichtlich dargestellt wird, oder?). Ich würde das im wesentlichen umdrehen und eine anonyme Subroutine als anonyme Funktion charakterisieren, die keinen Wert zurückgibt... --Tobias 16:54, 2. Aug. 2007 (CEST)
PHP
BearbeitenAnders als im Artikel behauptet, hat PHP keine anonymen Subroutinen. create_function() generiert eine Funktion der Form "\0lambda_[0-9]+", wobei "\0" == NULL ist. Damit ist es eine benannte Funktion. Siehe auch die Kommentare auf http://de3.php.net/manual/en/function.create-function.php
C++ - Übergabe einer anonymen Funktion
BearbeitenDas Beispiel für anonyme Funktionen in C++ besagt, dass fast jede Lamba-Funktion einen anderen Typ hat und deshalb Templates verwendet werden müssen. Das ist nicht ganz korrekt. Es stimmt zwar, dass der Typ zunächst sehr viele Details enthält die eine exakte Deklaration unmöglich machen, aber das ist nicht wirklich ein Problem, denn zur Kapselung von anonymen Funktionen gibt es std::function. Die Verwendung ist denkbar einfach:
std::function<void ()> func = [] () {/* your code */}; func(); // Aufruf
natürlich auch mit Parametern und capture:
int a = 1; std::function<int (int)> getAPlusX = [a] (int b) {return a + b}; std::cout << getAPlusX(2) << std::endl; // 3
Auf die gleiche Weise, wie oben die Funktion zugewiesen wird, kann sie auch an andere Funktionen weitergegeben werden.
Vorteil gegenüber Templates: es wird direkt dokumentiert, welche Parameter die Funktion entgegennehmen muss und was sie zurückgibt. Im Fall von Templates ergibt sich dies nur durch den Quellcode, der sie verwendet. (nicht signierter Beitrag von 178.14.143.155 (Diskussion) 16:36, 25. Dez. 2014 (CET))
JavaScript + JScript
BearbeitenJS hab ich mal mit aufgenommen. Erschließt sich allerdings eher für jemanden, der sich wirklich mit DOM auskennt: Verwendet man return function (blabla), und lässt sich den Result mit alert(objekt.innerHTML) ausgeben, zeigt sich im Ausgabefenster function anonymous()! Vgl. auch http://www.html-world.de/program/js_o_fun.php und http://blogs.msdn.com/ericlippert/archive/2003/09/16/53021.aspx -andy 88.65.81.243 09:45, 1. Feb. 2008 (CET)
Wieso wird in dem Artikel eine benannte Funktion als Beispiel für anonyme bzw. unbenannte Funktionen aufgeführt?
// Beispiel Anonyme Funktion: die Funktion hat keinen Bezeichner bzw Namen:
let summe1 = function(a, b) {
return a + b;
}
// gleiches Beispiel einer Anonymen Funktion als Lambda bzw. Arrow-Function:
let summe2 = (a, b) => a + b
Das aktuelle Codebeispiel im Artikel ist meiner Meinung nach völlig am Ziel vorbei. Irgendwie ist der ganze Artikel am Thema vorbei, wenn man eigentlich nach Lambda Funktionen sucht. Lambda Funktionen gibt es eigentlich gar nicht, sondern es handelt sich vielmehr um Ausdrücke. Deutschsprachige Wikipedia war noch nie eine gute Quelle, wenn es um Programmierung geht. (nicht signierter Beitrag von Xidimax (Diskussion | Beiträge) 23:56, 5. Feb. 2022 (CET))
First-class object
BearbeitenWir haben den einleitenden Satz
- Anonyme Subroutine beschreibt eine Funktion eines Computerprogramms, die nicht über ihren Namen, sondern ausschließlich über Verweise (Referenzen, Zeiger, etc.) angesprochen werden kann.
Das ist m. E. zu ergänzen durch:
- Das setzt voraus (oder: geht damit einher), daß Funktionen von der jeweiligen Programmiersprache als vollwertige Objekte behandelt werden, die beispielsweise einer Variablen zugewiesen oder als Argument übergeben werden können.
Inhaltliche/sonstige Einwände?
Ich habe in der deutschen Wikipedia noch keinen Artikel über „First-class objects“ gefunden und bin mir nicht sicher, ob es eine etablierte Eindeutschung gibt („Objekt erster Klasse“???); ich schlage hier also „Vollwertiges Objekt“ vor.
- Im Artikel Programmiersprache gibt es die Bezeichnungen „Bürger erster Klasse (First class Citizens – FCCs)“, allerdings ohne jegliche Verlinkungen. --Tobias 18:12, 12. Jun. 2009 (CEST)
Hier ist übrigens etwas Python-Code (interaktive Interpreter-Sitzung), der Funktionsobjekte und Anonyme Funktionen demonstriert:
>>> def a(i):
... return i+1
...
>>> b = a
>>> repr(a)
'<function a at 0x00B609F0>'
>>> repr(b)
'<function a at 0x00B609F0>'
>>> c = lambda i: i+1
>>> repr(c)
'<function <lambda> at 0x00B60A70>'
>>> a(2)
3
>>> b(2)
3
>>> c(2)
3
>>> a is b
True
>>> a is c
False
Im Beispiel sind a und b also völlig gleichwertige Verweise auf dieselbe Funktion (deren Identität mit dem Operator is überprüft werden kann); c erhält eine anonyme Funktion als Wert zugewiesen.
Direkte Verwendung einer anonymen Funktion, die das Quadrat ihres Arguments zurückgibt:
>>> liste = [1, 2, 3]
>>> liste
[1, 2, 3]
>>> map(lambda a: a*a, liste)
[1, 4, 9]
Es mag sein, daß ich voreingenommen bin, aber ich finde, daß die Perl-Beispiele etwas Verwirrung stiften – was soll dieses „my“? –, während Python das Konzept viel intuitiver umsetzt und sich für die Beispiele entsprechend besser eignet. --Tobias 17:19, 12. Jun. 2009 (CEST)
Verschieben nach "Anonyme Funktion"?
BearbeitenGründe:
- Der vorliegende Artikel verwendet "Subroutine" und "Funktion" vollständig austauschbar.
- Die von Pascal getroffene totale Unterscheidung zwischen Prozeduren und Funktionen (welche halbherzig auch in C und seinen Abkömmlingen vorkommt, und in anderen Sprachen auch) ist unsinnig. Eine Funktion kann minimal 0 Bits zurückgeben. Die damit kodierte Botschaft ist dann aber nicht nichts, sondern die leere Botschaft. Dass der Aufrufer deren Inhalt vor dem Aufruf schon kennt, tut nichts zur Sache.
- Der Artikel Anonyme Funktion ist eine Begriffsklärung, die hierher und auf die viel größere Begriffsklärung Lambda-Funktion verweist.
- Einer der in Lambda-Funktion genannten Begriffe könnte sinnvollerweise auf den vorliegenden Artikel (bzw. seine verschobene Variante) verweisen. Momentan verweist er auf viele Artikel zu verschiedenen Programmiersprachen.
Hat ein erfahrener Editor Lust, das zu machen? Ich mein', das Problem ist ja relativ eklig, auch unter nicht-Beachtung von Links zu den betroffenen Artikeln: ein Artikel soll verschoben werden und den gleichen Namen erhalten, den ein bereits existierender hat. Ich hab' keine Ahnung, welcher Unsinn in Kooperation mit der Mediawiki-Software dabei 'rauskommen kann. --Daniel5Ko 22:00, 16. Jun. 2010 (CEST)
- Nachdem ich der dritte war, der das genau so sah, hab' ich die Verschiebung, nebst Textanpassung, umgesetzt. --Geri, ✉ 23:17, 19. Sep. 2011 (CEST)
What is it and what shalls?
BearbeitenAus dem Artikel wird zwar verständlich, wie anonyme Funktionen definiert sind, es wird jedoch nicht erkenntlich, welche Vorteile das Konstrukt bietet. Neben dem Was sollte auch das Warum erläutert werden. --Pythagomath (Diskussion) 12:02, 18. Mai 2014 (CEST)
- Das ist auch mein Hauptproblem mit dem Artikel. In letzter Zeit häuft sich für mich der Eindruck, dass Lambdas außerhalb einer theoretischen Informatik als Code Smell angesehen werden, der unleserlich, unverständlich, untestbar und damit extrem problematisch für Produktionscode ist. Und nebenbei verstößt der Gebrauch gegen diverse Programmierprinzipien wie SLA, KISS oder DRY. Beispiele für die Kritik sind:
- Das sind nur einige der ersten Google-Treffer zu dem Thema. Aber nicht einmal diese Kritik am Konstrukt "Lambda-Funktion" spiegelt der Artikel wieder! Beim Lesen dieses Artikels hatte ich mir eine Zusammenfassung dazu erhofft, welchen Sinn/Nutzen diese in der Realität wahrscheinlich nur missverstandenen und einfach nur falsch eingesetzten Funktionen haben sollen. Und zwar konkreter und domain-spezifischer als dies der Artikel Lambda-Kalkül beschreibt (falls der neben den ganzen Formeln überhaupt irgendwas beschreibt). Stattdessen besteht der Artikel aus Programmierbeispielen! Zu meiner Zeit wäre so ein nichtssagender Text ein akuter Löschkandidat gewesen. Just saying. --Trac3R (Diskussion) 10:14, 26. Jan. 2020 (CET)
- Grundsätzlich kann der Gebrauch von Lambdas dann empfehlenswert sein, wenn man eine kleine Funktion hat, die man modularisiert mit Funktionen höherer Ordnung kombiniert.
- z.B. kann man eine häufig genannte "filter" Funktion definieren, die ein Container und eine Funktion als Parameter hat. Im Pseudocode könnte man so etwas schreiben wie
- container.filter(lambda x => x > 0)
- Es wäre in diesem Code nicht sonderlich sinnvoll, für so eine kleine Logik eine benannte Funktion zu schreiben, da dieser funktionale Ausdruck auch als
- y = List()
- for (x in container) {
- if (x > 0)
- y.add(x)
- if (x > 0)
- }
- (Pseudocode) geschrieben werden kann. Für so eine Schleife würde man auch nicht immer eine extra benannte Funktion schreiben. --Diaspomod (Diskussion) 00:25, 27. Jan. 2020 (CET)
- Nur so ein kleiner Hinweis am Rande: Dies ist kein Bulletin Board, sondern eine Artikeldiskussion. Hier werden auch keine Nutzerfragen geklärt. Falls es unstrittige Sekundärquellen für die korrekte und sinnvolle Verwendung von anonymen Funktionen gibt, am besten auch noch sprachneutral, dann sollte die Information darüber ganz oben in den Artikel eingepflegt werden. Und die Erwähnung einer Diskussion über die „Overlambdafication“ könnte es auch geben. Für beides sollte jedoch auf eine kritische Auswahl von Quellen geachtet und WP:TF vermieden werden. --89.245.190.26 11:37, 27. Jan. 2020 (CET)
- Ich vermute, dass es schwer werden könnte, über den Programmierstilgeschmack unstrittige Quellen zu finden, die in eine Enzyklopädie passen. Ich würde analog auch keine Buchkritik von Neuerscheinungen in die Wikipedia langfristig einpflegen. Ich bin aber auch in der Wikipedia Policy nicht gut bewandert. --Diaspomod (Diskussion) 15:27, 27. Jan. 2020 (CET)
- Nur so ein kleiner Hinweis am Rande: Dies ist kein Bulletin Board, sondern eine Artikeldiskussion. Hier werden auch keine Nutzerfragen geklärt. Falls es unstrittige Sekundärquellen für die korrekte und sinnvolle Verwendung von anonymen Funktionen gibt, am besten auch noch sprachneutral, dann sollte die Information darüber ganz oben in den Artikel eingepflegt werden. Und die Erwähnung einer Diskussion über die „Overlambdafication“ könnte es auch geben. Für beides sollte jedoch auf eine kritische Auswahl von Quellen geachtet und WP:TF vermieden werden. --89.245.190.26 11:37, 27. Jan. 2020 (CET)
- In den verlinkten Texten finde ich Aussagen darüber, dass anonyme Funktionen ursprünglich aus der funktionalen Programmierung stammen. Eines der Paradigmen von FP ist, dass eine Funktion keine Seiteneffekte haben darf. Der von dir vorgestellte Lambda-Funktion für den Filter hat z.B. keine. Es dürfte aus der FP einiges an Literatur geben, welches das Thema der anonymen Funktionen behandelt, *bevor* diese in andere Sprachen portiert und nun defizitär eingesetzt und missbraucht werden.
- Schwierig wird es dagegen, einen Konsens über die kritische Verwendung zu finden. Allerdings ist halt einfach festzustellen, dass viele gute Praktiken der letzten Jahre, die aus dem Umfeld von XP und Co. stammen und mit guter Codequalität zusammenhängen, bei der Nutzung von Lambdas über den Haufen geworfen werden. Code wird wieder einfach Writeonly hingehackt und muss für Refactorings neu geschrieben werden. Das hat wenig mit Stil oder Geschmack zu tun. Zumindest im professionellen Umfeld. --Trac3R (Diskussion) 23:28, 27. Jan. 2020 (CET)
- Das Grundproblem schlechter Codequalität ist generell gegeben. Nicht nur bei Lambdas, sondern auch bei falschem Gebrauch von virtuellen Methoden, Goto, globalen Variablen, Mehrfachverbung / Mehrfachvererbungshierarchien etc. Ich würde vorschlagen, den Artikel mit der Anwendung bei Higher-Order-Functions anzureichern, mit Erwähnung der referentiellen Transparenz bei der FP. Die Beispiele würde ich alle streichen und ersetzen mit einm sinvollen Beispiel mit z.B. filter oder map, reduce oder etwas anderes. --Diaspomod (Diskussion) 12:37, 28. Jan. 2020 (CET)
Deutsch vs. Englisch
BearbeitenDa wir hier die deutschsprachige Wikipedia bearbeiten, finde ich es nicht verkehrt auch auf deutsch verständlichen Quelltext zu haben. Ich würde auch den gesamten Quelltext übersetzen. Es ist aber ok, wenn die Übersetzung nur des ersten Abschnitts im Artikel erledigt ist und das andere noch zu übersetzen ist. Wie daraus eine Inkonsistenz entstehen soll, die einen Editwar rechtfertigt, kann ich nicht erkennen. Wenn irgendwelche inhaltlichen Gründe dagegen sprechen, dann bitte einfach andere deutschsprachige Wörter verwenden. Wenn "identifier" eine magic method in C ist, dann bitte mitteilen, statt mit falschen Begrüdungen zu reverten. @Diaspomod: --Amtiss, SNAFU ? 18:37, 7. Sep. 2020 (CEST)
- Siehe auch Wikipedia:Wie_schreibe_ich_gute_Artikel#Verständlichkeit und Clean Code, in diesem Fall vielleicht der Aspekt von Principle of Least Surprise (bzw. eben die Zielgruppe deutschsprachige Leser). -- Amtiss, SNAFU ? 19:35, 7. Sep. 2020 (CEST)
- Ich kann das Friedensangebot machen, dass ich die Programmcodes aus dem gesamten Artikel auf Deutsch übersetze, soweit es geht. Allerdings finde ich abseits eines Lexikons oder Lehrmitteln sehr schlecht, deutsche Bezeichner zu verwenden, da die Softwarebibliotheken und Frameworks alle englische Bezeichner benutzen, die hier auch verwendet werden. Dann hat man zwangsläufig einen Mix aus deutschen und englischen Bezeichnern. Also werden die Bezeichner zwangsläufig zur Hälfte auf Englisch bleiben. Englisch ist auch die Lingua Franca bei der Softwareentwicklung (wie auch sonst in der heutigen Zeit). --Diaspomod (Diskussion) 23:03, 7. Sep. 2020 (CEST)
- Richtig, "abseits eines Lexikons oder Lehrmitteln". Wir sind hier in einem Lexikon. Der Mix aus Deutsch und Englisch ist sogar hilfreich, um zu erkennen, was zur jeweiligen Sprache gehört und was vom Programmierer ausgewählt wurde. Da ein Wikipedia-Artikel kein Programmiertutorial ist, brauchen wir auch nicht die Eigenschaften eines solchen übernehmen. Wenn der Code an übliche Sprachwahl oder Lingua franca angepasst wäre, würde im diskutierten Code "foo" statt "identifier" stehen, siehe dazu en:Identifier_(computer_languages). Das Problem in der Verständlichkeit sehe ich v.a. in der Kontrastarmut: der Identifier/Bezeichner klingt sehr ähnlich wie der Rest vom Code und es braucht Extra-Anstrengung um den Bezug zum vorangegangenen Text herzustellen. So viele Gründe, die der Verständlichkeit abträglich sind. --Amtiss, SNAFU ? 01:14, 8. Sep. 2020 (CEST)
- Ich kann das Friedensangebot machen, dass ich die Programmcodes aus dem gesamten Artikel auf Deutsch übersetze, soweit es geht. Allerdings finde ich abseits eines Lexikons oder Lehrmitteln sehr schlecht, deutsche Bezeichner zu verwenden, da die Softwarebibliotheken und Frameworks alle englische Bezeichner benutzen, die hier auch verwendet werden. Dann hat man zwangsläufig einen Mix aus deutschen und englischen Bezeichnern. Also werden die Bezeichner zwangsläufig zur Hälfte auf Englisch bleiben. Englisch ist auch die Lingua Franca bei der Softwareentwicklung (wie auch sonst in der heutigen Zeit). --Diaspomod (Diskussion) 23:03, 7. Sep. 2020 (CEST)
- Es gibt keine "deutschen" Quelltexte, was soll das sein? Oder meinst Du englischsprachige Kommentare in den Quelltexten? --Xid (Diskussion) 23:35, 5. Feb. 2022 (CET)
Danke für die Umsetzung. Ich kann verstehen, dass das erstmal komisch aussieht, wenn man's anders gewohnt ist. --Amtiss, SNAFU ? 17:12, 8. Sep. 2020 (CEST)