Falsches Gefühl der Sicherheit . Das ist Unsinn.
Einige Grundtypen . OCaml verfügt nun über Bytes und Bytearrays, jedoch keine integrierten Unicode-Zeichenfolgen, 16-Bit-Ganzzahlen, vorzeichenlosen Ganzzahlen, 32-Bit-Gleitkommazahlen, Vektoren oder Matrizen. Bibliotheken von Drittanbietern bieten einige davon an.
Silent Integer Overflow . Unverändert, aber es war nie ein Problem.
Modul Unveränderlichkeit . Seine Empfehlung, dass Funktionen und Module wandelbar sein sollten, ist ein grimmiger Rückfall für Lisp und eine wirklich schlechte Idee. Sie können Module mit ersetzen, include
wenn Sie möchten, aber Sie können sie natürlich nicht mutieren.
Polymorphismus verursacht Laufzeitfehler . Dies ist ein großes Problem mit OCaml und es wurde nicht behoben. Während sich Ihre Typen zu einer polymorphen Gleichheit entwickeln, werden Vergleich und Hashing fehlschlagen, wenn sie auf Typen wie Funktionen stoßen und das Problem nur sehr schwer behoben werden kann. F # hat eine großartige Lösung für dieses Problem.
Keine Makros . Ironischerweise hatte OCaml, als er dies schrieb, tatsächlich die volle Unterstützung für Makros, aber sie haben sich jetzt entschieden, die Funktion herauszunehmen.
Wrapper . Dies war ein echtes Problem und es wurde nicht behoben. Es gibt noch kein try ... finally
Konstrukt in der OCaml-Sprache und keinen Wrapper, der es in der stdlib implementiert.
Orte . Unverändert, aber kein Problem.
Rekord Feldnamen Hölle . Strukturieren Sie Ihren Code richtig mit Modulen.
Syntax . Unverändert, aber kein Problem.
Kein Polymorphismus . Dies war größtenteils Unsinn, als er es schrieb und nichts hat sich geändert.
Inkonsistente Funktionssätze . OCaml hat noch keine cons
Funktion. Das ist gut. Ich möchte kein Lisp-Zeug in meiner Sprache, danke.
Keine dynamischen Variablen . War eine gute Sache über OCaml. Ist immer noch eine gute Sache über OCaml.
Optionale ~ Argumente saugen . Optionale Argumente rocken. Ich habe Microsoft verärgert, dass sie optionale Argumente zu F # hinzufügen sollen.
Teilweise Inkonsistenz der Argumentanwendung . Wie?
Lesbarkeit der Arithmetik . Dies hat sich geändert, seit ich OCaml ~ vor 8 Jahren nicht mehr benutze. Anscheinend kannst du es jetzt tun Int64.((q * n - s * s) / (n - 1L))
.
Stille Namenskonfliktlösung . Er hat versucht, in der REPL eine vollständige Softwareentwicklung durchzuführen, wie Sie es in Lisp tun würden. Mach das nicht in OCaml. Verwenden Sie Dateien und Stapelkompilierungen, die auf die REPL zurückgreifen, nur zum Testen, Ausführen von Einwegcode und für interaktives technisches Rechnen.
Reihenfolge der Bewertung . Das war falsch, als er es schrieb. Die Reihenfolge der Auswertung ist in OCaml undefiniert.
Keine Objekteingabe / -ausgabe . Er zitierte eine Drittanbieter-Bibliothek, die dieses "Problem" bereits löste.
Der Compiler stoppt nach dem ersten Fehler . Wie?
Kein Stack-Trace für nativ kompilierte ausführbare Dateien . Fest.
Debugger saugt . Ich habe den Debugger nie benutzt. Die statische Typprüfung fängt fast alle meine Fehler ab.
GC saugt . Ich fand OCamls GC hervorragend, mit Ausnahme eines Hauptproblems: Die globale Sperre verhindert die parallele Programmierung.
Keine impliziten Vorwärtserklärungen . Die gegenseitige Rekursion ist in allen MLs ausdrücklich vorgesehen. Die einzige Kuriosität ist, dass type
Definitionen standardmäßig rekursiv sind, während let
Bindungen standardmäßig nicht rekursiv sind.
Funktionsrunde fehlt . OCaml hat immer noch eine reine Standardbibliothek, aber Bibliotheken von Drittanbietern wie Jane St's Core round
und Freunde.
Listen . List.map
ist immer noch nicht rekursiv. Ich reichte Patches ein, um solche schwerwiegenden Fehler zu beheben, und musste Jahre warten, bis sie in Veröffentlichungen auftauchten. Listen sind natürlich noch unveränderlich. Und so sollten sie sein.
Geschwindigkeit . Ich glaube, die Kompilierungszeiten für große polymorphe Varianten wurden behoben.
Mustervergleich . Ein Triumph der Hoffnung über die Realität. Die Lisp-Community hat dies versäumt. Daher meine 10. Regel: Jedes ausreichend komplizierte Lisp-Programm enthält eine ad-hoc, informell spezifizierte und fehlerbehaftete Implementierung der Hälfte von OCamls Pattern Match Compiler.
Sie können den hübschen Drucker jedoch von der obersten Ebene aus als Bibliotheksaufruf aufrufen und ihm die erforderlichen Typinformationen geben. Und es gab ein Makro, mit dem Sie Datenstrukturen mit Anmerkungen versehen können, damit hübsche Drucker automatisch generiert werden.