Beim Erlernen einer neuen Programmiersprache stößt man manchmal auf eine Sprachfunktion, die den Wunsch aufkommen lässt, sie in anderen Programmiersprachen zu haben, die Sie kennen.
Was sind einige Sprachfunktionen, die zum Zeitpunkt des Lernens sehr neu für Sie waren und die Sie sich für Ihre anderen Programmiersprachen wünschen.
Ein Beispiel hierfür sind Generatoren in Python oder C #. Andere Beispiele können Listenverständnisse in Python, Vorlagen in C ++ oder LINQ in .NET oder verzögerte Evaluierung in Haskell umfassen.
Welche anderen halb-einzigartigen Sprachfunktionen sind Ihnen begegnet, die für Sie völlig neu und aufschlussreich waren? Gibt es andere Merkmale älterer Programmiersprachen, die einzigartig und unmodern waren?
quelle
Lisp-Makros.
Die Lisp-Makrosprache ist Lisp mit einigen vordefinierten Syntaxfunktionen. Mit ihnen ist es möglich, der Sprache wichtige Merkmale hinzuzufügen, wie z. B. die Auswahl von Objektorientierungsstilen oder prologähnliche deterministische Übereinstimmungen, ohne den Platz zu verlassen. Es macht das
setf
Makro möglich, die ein konzeptionell sehr leistungsfähiger Makro ist:(setf A B)
bedeutet , dass, wenn Sie bewertenA
Sie erhaltenB
, und das kann auf jeden Grenzen Sie wie verlängert werden.Die Metaprogrammierung von C ++ - Vorlagen kann ähnliche Dinge, jedoch in einer anderen Sprache als reguläres C ++.
quelle
Pythons Dekorateur.
Mit dem Decorator ist es extrem einfach, Merkzettel oder Timing von Funktionen zu implementieren.
Beispiel einer Funktionsuhr.
Wenn Sie eine Funktion haben, die Sie zeitlich festlegen möchten, können Sie dies einfach tun.
Sie werden so etwas wie sehen,
Die Funktion 'foo' dauerte 3 Sekunden.
quelle
Umwandeln
void*
in C. Sie können alles in unformatierte Bytes umwandeln und mit diesen Daten tun, was Sie wollen .(Ja, heutzutage ist es einzigartig ...)
quelle
void*
...Pointer
in Pascal und Object Pascal bewirkt dasselbe.int64_t
das du nicht immer sicher wirken kannstvoid *
(Sorry für die späten 2 Jahre - antworte).Ausbeute in Python
In Python (und ich glaube an C #) können Sie einen sogenannten Generator definieren, der die Funktionsausführung bei einer
yield
Anweisung anhält, den Wert zurückgibt und bei nachfolgenden Aufrufen die Funktion an der Stelle neu startet, an der sie aufgehört hat (wobei der Status zwischen den Aufrufen erhalten bleibt). Dies ist ideal, um lange Wertelisten zu generieren, bei denen Sie nur den aktuellen Wert der Funktion (der sehr häufig vorkommt) benötigen. Sie können damit möglicherweise unendlich lange Sequenzen erstellen und dabei nur sehr wenig Speicherplatz belegen.quelle
Lambda-Ausdrücke (Abschlüsse, verschachtelte Funktionen, anonyme Methoden, wie auch immer Sie sie nennen).
Ich habe sie in Perl kennengelernt, sie sofort geliebt und mich gefragt, warum andere Sprachen sie nicht haben. Heutzutage denke ich, dass es nicht mehr so einzigartig ist; sogar PHP hat es geschafft, sie irgendwie zu hacken. Aber sie waren zu dieser Zeit halb einzigartig.
quelle
Fortsetzung von Schema (später von einigen anderen Sprachen übernommen, einschließlich Ruby)
quelle
Sets in Delphi sind sehr nützlich, so ziemlich nur ein benanntes boolesches Array. Sie sind sehr nützlich, um ein Einstellungsformular mit 32 Kontrollkästchen zu speichern. Aber sie haben alle die gleichen Mengenfunktionen (dh Differenz, Schnittmenge, Vereinigung).
Ich bin nicht sicher, ob sie aus der Mode gekommen sind, aber ich benutze sie die ganze Zeit.
quelle
Senden
Aus Erlang. Sendet eine Nachricht asynchron an einen anderen Thread.
Erhalten
Aus Erlang. Erhält eine Nachricht von einem anderen Thread.
quelle
C # -Eigenschaften
vs
(Java)
quelle
Gewerkschaften in C
Ich kann nicht ehrlich sagen, dass ich nicht genug C geschrieben habe, um eines davon selbst zu machen, aber ich habe mit dem Code anderer gearbeitet, der das tut.
Wenn es darum geht, Mischungen verschiedener Daten in Anwendungen zu verpacken, die unformatierte Bits / Bytes wie Netzwerk- oder Binärdatenspeicherung manipulieren. In stark typisierten Sprachen gibt es einfach keine einfache Möglichkeit, das Äquivalent zu tun.
Haftungsausschluss:
Obwohl Unions in einigen Fällen äußerst nützlich sind, werden sie in den meisten höheren Sprachen nicht gefunden, da sie nicht typsicher sind. IE, Sie können Daten mit Hilfe von Gewerkschaften über Variablengrenzen hinweg bluten lassen (ein großes Nein Nein in der typsicheren Welt). Mit großer Macht kommt große Verantwortung.
quelle
union
Verwendung ist sicher, einige werden gut unterstützt (obwohl technisch nicht korrekt) - siehe cellperformance.beyond3d.com/articles/2006/06/… (obwohl es schwieriger ist, Zeiger zu verwenden, können Gewerkschaften dies gut vortäuschen).record
Syntax, um Gewerkschaften zu unterstützen:in_addr = record case integer of 0: (S_un_b: SunB); 1: (S_un_w: SunW); 2: (S_addr: u_long); end;
Ich mag den wenn nicht Modifikator in Ruby . Es scheint so natürlich und ersetzt viele Szenarien, in denen Ihr Code ohne es nur sehr chaotisch zu sein scheint.
Wie kannst du das nicht mögen? : D
quelle
unless
undwhen
ersetzt die gängigsten Verzweigungsszenarien, die traditionell verwendet werdenif/else
.ausgefallene Python-Argument-Syntax
Ich bin mir nicht sicher, wie einzigartig dies ist, aber in Python können Sie coole Dinge tun, z. B. Keyword-Paare automatisch in ein Wörterbuch umwandeln und zurück. Gleiches gilt für Listen:
Python-Dokumente (scrollen Sie nach unten, um weitere Argumente zu finden)
quelle
Der C-Präprozessor. Sie können sogar gemeinsamen Code mit weniger oder mehr ifdefs auf verschiedene Plattformen schreiben.
quelle
Ziel-C-Kategorien
Kategorien bieten eine einfache Möglichkeit, die Funktionalität eines Objekts zur Laufzeit zu erweitern (Komposition versus Vererbung). Das klassische Beispiel ist das Hinzufügen einer Rechtschreibprüfung zur NSString-Klasse.
Auch nützlich für Fehlerbehebungen mit geringer Auswirkung, da die Implementierung einer Methode durch eine Kategorie die Implementierung der Eltern überschreibt.
quelle
Ruby ‚s inject Methode mit dem kombinierten # to_proc Symbol Feature von Ruby 1.9 kann einen Schreib einig unglaublich präziser (aber immer noch lesbar) Code:
z.B
(1..10).inject(:+)
das summiert die ganzen Zahlen 1 bis 10 => 55
Beispiele wie dieses zu sehen, hat mich dazu gebracht, Ruby zu lernen, was ich gerade angefangen habe.
quelle
Der Bindungsmechanismus in JavaFX (RIP). Mit dem Schlüsselwort bind können Sie den Wert einer Variablen an den Wert eines Ausdrucks binden und all den hässlichen Listener-Code loswerden.
Während JavaFX in vielerlei Hinsicht ein ziemlicher Fehlschlag war, fand ich viele Funktionen der Skriptsprache ganz nett.
quelle
String-Mixins und die Auswertung der Kompilierzeitfunktion in D sind ein ziemlich einzigartiges Killer-Feature. Ja, technisch gesehen sind es zwei Merkmale, aber die wahre Stärke liegt in der Kombination dieser Merkmale. Mit dieser Kombination können Sie reguläre D-Funktionen schreiben, die zum Zeitpunkt der Kompilierung Code als Zeichenfolge generieren. Anschließend können Sie diesen Code in einen beliebigen Bereich mischen und ihn als regulären D-Code auswerten lassen. Der Code ist vollständig statisch kompiliert und wird genauso ausgeführt, als ob er handgeschrieben wäre. Diese Funktion wird sogar verwendet, um ein paar unangenehme Situationen in der Standardbibliothek zu umgehen.
quelle