Falso senso di sicurezza . Questo non ha senso.
Pochi tipi di base . OCaml ora ha byte e array di byte ma nessuna stringa unicode integrata, numeri interi a 16 bit, numeri interi senza segno, float a 32 bit, vettori o matrici. Le librerie di terze parti forniscono alcune di queste.
Overflow intero silenzioso . Invariato ma non è mai stato un problema.
Immutabilità del modulo . La sua raccomandazione che funzioni e moduli dovrebbero essere mutabili è un triste ritorno al Lisp e una pessima idea. Puoi sostituire i moduli usando include
se vuoi, ma non puoi mutarli, ovviamente.
Il polimorfismo causa errori di tipo runtime . Questo è un grosso problema con OCaml e non è stato risolto. Man mano che i tuoi tipi evolvono l'uguaglianza polimorfica, il confronto e l'hashing falliranno quando incontrano tipi come funzioni e il debug del problema è molto difficile. F # ha un'ottima soluzione a questo problema.
Nessuna macro . Ironia della sorte, quando ha scritto questo OCaml in realtà aveva il pieno supporto per le macro ma ora hanno deciso di estrarre la funzionalità.
Wrapper . Questo è stato un vero problema e non è stato risolto. Non esiste ancora alcun try ... finally
costrutto nel linguaggio OCaml e nessun wrapper che lo implementa nello stdlib.
Luoghi . Invariato ma non problematico.
Registra un campo che dà un nome all'inferno . Strutturare correttamente il codice utilizzando i moduli.
Sintassi . Invariato ma non problematico.
Nessun polimorfismo . Questo è stato per lo più senza senso quando lo ha scritto e nulla è cambiato.
Set di funzioni incoerenti . OCaml non ha ancora una cons
funzione. Va bene. Non voglio roba di Lisp nella mia lingua, grazie.
Nessuna variabile dinamica . È stata una buona cosa per OCaml. È ancora una buona cosa su OCaml.
Gli argomenti ~ facoltativi fanno schifo . Argomenti opzionali rock. Ho provato a Microsoft per convincerli ad aggiungere argomenti opzionali a F #.
Incoerenza dell'applicazione argomento parziale . Eh?
Leggibilità dell'aritmetica . Questo è cambiato da quando ho smesso di usare OCaml ~ 8 anni fa. Apparentemente ora puoi farlo Int64.((q * n - s * s) / (n - 1L))
.
Risoluzione silenziosa del conflitto di nomi . Stava cercando di fare un vero e proprio sviluppo software nel REPL come faresti con Lisp. Non farlo in OCaml. Utilizzare file e compilazione batch ricorrendo al REPL solo per test, esecuzione di codice usa e getta e elaborazione tecnica interattiva.
Ordine di valutazione . Questo era sbagliato quando lo scrisse. L'ordine di valutazione non è definito in OCaml.
Nessun oggetto input / output . Ha citato una biblioteca di terze parti che ha già risolto questo "problema".
Il compilatore si arresta dopo il primo errore . Eh?
Nessuna traccia di stack per eseguibili compilati in modo nativo . Fisso.
Il debugger fa schifo . Non ho mai usato il debugger. Il controllo statico del tipo cattura quasi tutti i miei bug.
GC fa schifo . Ho trovato il GC di OCaml superbo, tranne per un grosso problema: il blocco globale impedisce la programmazione parallela.
Nessuna dichiarazione a termine implicita . La ricorsione reciproca è esplicita in base alla progettazione in tutte le ML. L'unica stranezza è che le type
definizioni sono ricorsive per impostazione predefinita, mentre i let
binding non sono ricorsivi per impostazione predefinita.
Il round di funzioni è assente . OCaml ha ancora uno stile semplice ma le librerie di terze parti come Jane St's Core forniscono round
e amici.
Liste . List.map
non è ancora ricorsivo alla coda. Ho inviato patch per correggere bug gravi come questo e ho dovuto aspettare anni prima che apparissero nelle versioni. Le liste sono ancora immutabili, ovviamente. E così dovrebbero essere.
Velocità . Credo che i tempi di compilazione per le grandi varianti polimorfiche siano stati corretti.
Corrispondenza del modello . Un trionfo di speranza sulla realtà. La comunità Lisp non è riuscita a farlo. Da qui la mia decima regola: qualsiasi programma Lisp sufficientemente complicato contiene un'implementazione ad hoc, specificata in modo informale e piena di bug di metà del compilatore di pattern match di OCaml.
ma potresti invocare la bella stampante dal livello più alto come una chiamata in libreria, dandogli le informazioni necessarie sul tipo. E c'era una macro che è possibile utilizzare per annotare le strutture di dati al fine di avere le stampanti piuttosto autogenerate.