Welche Funktionen wünschen Sie in gemeinsamen Sprachen? [geschlossen]

7

Welche Funktionen wünschen Sie in den gängigen Sprachen? Genauer gesagt, ich meine Features, die überhaupt nicht existieren, aber schön zu sehen wären, anstatt "Ich wünschte, dynamisches Tippen war populär."

    
Brian 21.11.2008, 16:24
quelle

17 Antworten

11

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?

    
benjismith 21.11.2008 16:35
quelle
5

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.

    
Joris Timmermans 21.11.2008 16:32
quelle
5

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.

    
mipadi 21.11.2008 16:45
quelle
5

Ich bin ein großer Fan von Schließungen / anonymen Funktionen.

%Vor%

und

%Vor%

Ich wünschte nur, sie wären alltäglicher.

    
Kent Fredric 21.11.2008 17:05
quelle
4

Dinge von Lisp vermisse ich in anderen Sprachen:

  • Mehrere Rückgabewerte
  • erforderliche, Schlüsselwort-, optionale und Ruhe-Parameter (frei mischbar) für Funktionen
  • funktioniert als erstklassige Objekte (wird heutzutage immer häufiger verwendet)
  • Optimierung des Leitungsanrufs
  • Makros, die mit der Sprache arbeiten, nicht mit dem Text
  • konsistente Syntax
Svante 21.11.2008 17:24
quelle
2

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.

    
Brian 21.11.2008 16:25
quelle
2

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.

    
dsimcha 21.11.2008 18:38
quelle
2

immutable Schlüsselwort. Ja, Sie können unveränderliche Objekte erstellen, aber das ist viel Schmerz in den meisten Sprachen.

%Vor%

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.

    
user 27.05.2012 02:39
quelle
1

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.

    
Kilhoffer 21.11.2008 16:27
quelle
1

Tippe auf Inferenz. Es macht langsam seinen Weg in die Mainstream-Sprachen, aber es ist immer noch nicht gut genug. F # ist der Goldstandard hier

    
JaredPar 21.11.2008 17:58
quelle
0

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.

    
marcus 03.06.2011 16:39
quelle
0

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.

    
Brian 21.11.2008 16:30
quelle
0

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)

    
benjismith 21.11.2008 16:52
quelle
0

Lisp Style-Makros.

Mehrfache Versendung.

Tail Call Optimierung.

Erstklassige Fortsetzungen.

    
Glomek 21.11.2008 17:50
quelle
0

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.

    
Sherm Pendley 21.11.2008 17:53
quelle
0

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).

    
Anonymous 01.02.2011 13:47
quelle
-1

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.

  • Entfernen Sie Komplexitäten wie Operatorüberladung und Mehrfachvererbung, falls sie existieren.
  • Erzwinge alle nicht endgültigen Variablen auf Privat.
  • Mitglieder sollten standardmäßig auf "Final" setzen, sollten jedoch ein "Variable" -Tag haben, um es zu überschreiben. (Dies kann eine integrierte Unterstützung erfordern, damit das Builder-Muster voll wirksam wird).
  • Variablen sollten standardmäßig keinen "Null" -Wert zulassen, aber Variablen und Parameter sollten ein "nullable" -Tag haben, das anzeigt, dass null für diese Variable akzeptabel ist.

Es wäre auch schön, einige häufig fragwürdige Muster vermeiden zu können:

  • Einige eingebaute Methoden, um IOC / DI zu vereinfachen, um Singletons zu eliminieren,
  • Java - Eliminiere geprüfte Ausnahmen, damit die Leute aufhören, leere Fänge zu setzen.

Konzentriere dich abschließend auf die Lesbarkeit des Codes:

  • Benannte Parameter
  • Entfernen Sie die Möglichkeit, Methoden zu erstellen, die mehr als beispielsweise 100 Zeilen lang sind.
  • Fügen Sie eine Komplexitätsanalyse hinzu, um komplizierte Methoden und Klassen zu erkennen.

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 ...

    
Bill K 21.11.2008 17:54
quelle

Tags und Links