Ich habe oft gedacht, dass "beobachtbar" einen großen Feldmodifikator (wie öffentlich, privat, statisch, etc.) machen würde.
%Vor%Dann könnten andere Klassen einen Beobachter dieser Eigenschaft deklarieren:
%Vor%Der Compiler würde den gesamten Zugriff auf die CurrentScore-Eigenschaft mit Benachrichtigungscode umbrechen, und Beobachter würden sofort über die Änderung des Werts benachrichtigt.
Sicher können Sie das gleiche in den meisten Programmiersprachen mit Event-Listenern und Property-Change-Handlern tun, aber es ist ein großer Schmerz in den Arsch und erfordert eine Menge Stückwerk Rohrleitungen, vor allem, wenn Sie nicht der Autor der Klasse sind, deren Werte, die Sie beobachten möchten. In diesem Fall müssen Sie normalerweise eine Wrapperunterklasse schreiben, die alle Operationen an das ursprüngliche Objekt delegiert und Änderungsereignisse von mutator-Methoden sendet. Warum kann der Compiler nicht diesen ganzen unausgegorenen Standardcode erzeugen?
Ich denke, die naheliegendste Antwort sind Lisp-ähnliche Makros. Die Möglichkeit, Ihren Code mit Ihrem Code zu verarbeiten, ist wunderbar "Meta" und erlaubt die Entwicklung einiger ziemlich beeindruckender Features aus (fast) Scratch.
Eine nahe Sekunde ist doppelte oder mehrfache Ausgabe in Sprachen wie C ++. Ich würde es lieben, wenn der Polymorphismus sich auf die Parameter einer virtuellen Funktion erstrecken könnte.
Ich hätte gerne mehr Sprachen, um ein Typsystem wie Haskell zu haben. Haskell verwendet ein wirklich tolles Inferenzsystem , so dass Sie -Typen fast nie deklarieren müssen es ist immer noch eine stark typisierte Sprache.
Ich mag auch die Art, wie Sie neue Typen in Haskell deklarieren. Ich denke, es ist viel schöner als z. B. objektorientierte Systeme. Um beispielsweise einen Binärbaum in Haskell zu deklarieren, könnte ich Folgendes tun:
%Vor%Also sind die zusammengesetzten Datentypen mehr wie algebraische Typen als Objekte. Ich denke, das erleichtert das Nachdenken über das Programm.
Außerdem ist das Mischen in Typklassen viel schöner. Eine Typklasse ist nur eine Menge von Klassen, die ein Typ implementiert - eine Art Schnittstelle wie in einer Sprache wie Java, aber eher wie ein Mix in einer Sprache wie Ruby, denke ich. Es ist irgendwie cool.
Idealerweise würde ich gerne eine Sprache wie Python sehen, aber mit Datentypen und Klassen wie Haskell anstelle von Objekten.
Ich bin ein großer Fan von Schließungen / anonymen Funktionen.
%Vor%und
%Vor%Ich wünschte nur, sie wären alltäglicher.
Dinge von Lisp vermisse ich in anderen Sprachen:
Ich möchte, dass der Standard für Zeichenketten ein Präfix verwendet, wenn Sie Escape-Codes verwenden möchten, anstatt dass sie standardmäßig verwendet werden. Z.B. In C # können Sie @ für eine rohe Zeichenfolge mit einem Präfix versehen. In ähnlicher Weise hat Python das Präfix r. Ich würde lieber @ / r verwenden, wenn ich keine rohe Zeichenkette möchte und einen Escape-Code benötige.
Leistungsfähigere Vorlagen, die eigentlich entworfen sind, um für die Metaprogrammierung verwendet zu werden, als C ++ - Vorlagen, die wirklich für relativ einfache Generika entworfen wurden und Turing-fast zufällig sind. Die D-Programmiersprache hat diese, aber es ist noch nicht sehr Mainstream.
immutable
Schlüsselwort. Ja, Sie können unveränderliche Objekte erstellen, aber das ist viel Schmerz in den meisten Sprachen.
Scheinbar scheint JustAClass
eine unveränderliche Klasse zu sein. Aber das ist nicht der Fall. Da ein anderes Objekt dieselbe Referenz enthält, kann das Objekt obj
geändert werden.
Es ist also besser, ein neues immutable
Keyword einzuführen. Wenn immutable
verwendet wird, wird dieses Objekt unveränderlich behandelt.
Ich mag einige der Manipulationsfunktionen, die in der Sprache Ruby gefunden werden. Ich wünschte, wir hätten etwas davon in .NET und Java eingebaut. Natürlich können Sie immer eine solche Bibliothek erstellen, aber es wäre schön, das nicht zu tun!
Auch statische Indexer sind großartig, wenn Sie sie brauchen.
Es gibt mehrere gute Antworten hier, aber ich werde einige hinzufügen:
1 - Die Fähigkeit, eine Zeichenfolgendarstellung für den aktuellen und den Aufrufercode zu erhalten, so dass ich einen Variablennamen und seinen Wert leicht ausgeben oder jederzeit den Namen der aktuellen Klasse, Funktion oder Stapelverfolgung drucken kann.
2 - Pipes wären auch nett. Diese Funktion ist in Shells üblich, in anderen Sprachen jedoch ungewöhnlich.
3 - Die Möglichkeit, eine beliebige Anzahl von Methoden leicht an eine andere Klasse zu delegieren. Das sieht nach Vererbung aus, aber selbst bei Vorhandensein von Vererbung brauchen wir ab und zu eine Art Wrapper oder Stub, der nicht als Kindklasse implementiert werden kann, und die Weiterleitung aller Methoden erfordert eine Menge Vorabcode.
Ich wünschte, es gäbe einen sich selbst umkehrenden Zuweisungsoperator, der zurückgesetzt wird, wenn er nicht mehr im Bereich ist. Dies wäre zu ersetzen:
%Vor%mit diesem
%Vor%Man könnte solche Änderungen explizit rückgängig machen, aber sie würden auch einmal außer Kraft gesetzt werden. Diese Art von Funktion wäre vielleicht ein wenig fehlerbehaftet, aber in einigen Fällen würde es auch für viel saubereren Code sorgen. Eine Art oberflächlicher Klon könnte ein effektiverer Weg sein, dies zu tun:
%Vor%Flache Klone könnten jedoch Probleme haben, wenn ihre Funktionen ihre internen Daten ändern ... obwohl dies auch reversible Zuordnungen wären.
Ich würde gerne Single-Methode und Single-Operator-Schnittstellen sehen:
%Vor%... oder so ähnlich ...
Ich stelle mir vor, dass es sich um eine typsichere Implementierung der Duck-Typisierung handelt. Die Schnittstellen wären keine Garantien des ursprünglichen Klassenautors. Sie würden Behauptungen sein, die von einem Verbraucher einer API eines Dritten gemacht werden, um eine eingeschränkte Typsicherheit in Fällen bereitzustellen, in denen die ursprünglichen Autoren nicht vorausgesehen hatten.
(Ein gutes Beispiel hierfür wäre die INumeric-Schnittstelle, die seit Anbeginn der Zeit in C # eingeklemmt wurde.)
In einer duck-typed Sprache wie Ruby können Sie jede gewünschte Methode aufrufen, und Sie werden bis zur Laufzeit nicht wissen, ob die Operation unterstützt wird, weil die Methode möglicherweise nicht existiert.
Ich möchte gerne kleine Garantien über die Typsicherheit geben, damit ich Methoden für heterogene Objekte polymorph aufrufen kann, solange alle diese Objekte die Methode oder den Operator haben, den ich aufrufen möchte.
>Und ich sollte in der Lage sein, die Existenz der Methoden / Operatoren zu überprüfen, die ich zur Kompilierzeit aufrufen möchte. Warten bis Laufzeit für Saugnäpfe ist: o)
Nenn mich albern, aber ich glaube nicht, dass jedes Feature in jede Sprache gehört. Es ist das "Tausendsassa, Meister von keinem" -Syndrom. Ich mag es, eine Vielzahl von Tools zur Verfügung zu haben, von denen jedes für eine bestimmte Aufgabe das Beste ist.
Funktionale Funktionen wie map, flatMap, foldLeft, foldRight und so weiter. Geben Sie ein System wie scala (builder-safety) ein. Die Compiler müssen High-Level-Bibliotheken zum Zeitpunkt der Kompilierung entfernen, während sie immer noch vorhanden sind, wenn Sie im "interpretierten" oder "weniger kompilierten" Modus arbeiten (Geschwindigkeit ... manchmal brauchen Sie es).
Ich hätte gerne eine Sprache, die viel restriktiver ist und darauf ausgerichtet ist, guten, wartbaren Code ohne irgendwelche Tricks zu produzieren. Außerdem sollte es so gestaltet sein, dass der Compiler so viel wie möglich zur Kompilierungszeit prüfen kann.
Beginnen Sie mit einer neuen VM-basierten OO-Sprache.
Es wäre auch schön, einige häufig fragwürdige Muster vermeiden zu können:
Konzentriere dich abschließend auf die Lesbarkeit des Codes:
Ich bin mir sicher, dass ich 1/10 der Elemente nicht genannt habe, aber im Grunde spreche ich über etwas, das mit dem gleichen Bytecode wie C # oder Java kompiliert, aber so restriktiv ist, dass ein Programmierer kaum helfen kann schreibe guten Code.
Und ja, ich weiß, dass es fusselartige Werkzeuge gibt, die etwas davon tun, aber ich habe sie nie in irgendeinem Projekt gesehen, an dem ich gearbeitet habe (und sie würden nicht physisch auf dem Code laufen, der ich bin z. B. arbeiten), so dass sie nicht sehr hilfreich sind, und ich würde gerne sehen, dass eine Kompilierung tatsächlich fehlschlägt , wenn Sie eine 101-Zeilen-Methode eingeben ...
Tags und Links language-features