Fałszywe poczucie bezpieczeństwa . To nonsens.
Kilka podstawowych typów . OCaml ma teraz bajty i tablice bajtów, ale nie ma wbudowanych ciągów Unicode, 16-bitowych liczb całkowitych, liczb całkowitych bez znaku, 32-bitowych liczb zmiennoprzecinkowych, wektorów lub macierzy. Biblioteki innych firm zapewniają niektóre z nich.
Ciche przepełnienie liczb całkowitych . Bez zmian, ale nigdy nie było problemu.
Niezmienność modułu . Jego zalecenie, aby funkcje i moduły były modyfikowalne, jest ponurą odpowiedzią na Lisp i naprawdę złym pomysłem. Możesz zastąpić moduły, include
jeśli chcesz, ale oczywiście nie możesz ich mutować.
Polimorfizm powoduje błędy typu Run-time . Jest to duży problem z OCaml i nie został naprawiony. Gdy twoje typy ewoluują pod względem równości polimorficznej, porównywanie i mieszanie zaczną się nie powieść, gdy napotkają takie typy jak funkcje, a debugowanie problemu jest bardzo trudne. F # ma świetne rozwiązanie tego problemu.
Bez makr . Jak na ironię, kiedy to napisał, OCaml faktycznie miał pełne wsparcie dla makr, ale teraz postanowili wycofać tę funkcję.
Owijarki . To był prawdziwy problem i nie został naprawiony. Nadal nie ma try ... finally
konstrukcji w języku OCaml i żadne opakowanie nie implementuje jej w stdlib.
Miejsca . Bez zmian, ale bez problemu.
Rekordowe nazewnictwo piekła . Zbuduj swój kod poprawnie za pomocą modułów.
Składnia . Bez zmian, ale bez problemu.
Bez polimorfizmu . Było to głównie nonsensem, kiedy to napisał i nic się nie zmieniło.
Niespójne zestawy funkcji . OCaml nadal nie ma cons
funkcji. W porządku. Nie chcę rzeczy Lisp w moim języku, dziękuję.
Brak zmiennych dynamicznych . To było dobre w OCaml. To wciąż dobra rzecz w OCaml.
Opcjonalne ~ argumenty do bani . Opcjonalne argumenty rock. Odznaczyłem Microsoft, aby kazał im dodać opcjonalne argumenty do F #.
Częściowa niespójność aplikacji argumentów . Co?
Czytelność arytmetyki . Zmieniło się to odkąd przestałem używać OCaml ~ 8 lat temu. Najwyraźniej teraz możesz to zrobić Int64.((q * n - s * s) / (n - 1L))
.
Rozwiązywanie konfliktów nazw niemych . Próbował w pełni rozwinąć oprogramowanie w REPL, tak jak w Lisp. Nie rób tego w OCaml. Używaj plików i kompilacji wsadowej odwołując się do REPL tylko do testowania, uruchamiania kodu jednorazowego i interaktywnych obliczeń technicznych.
Kolejność oceny . To było złe, kiedy to napisał. Kolejność oceny jest niezdefiniowana w OCaml.
Brak wejścia / wyjścia obiektu . Przytoczył bibliotekę strony trzeciej, która już rozwiązała ten „problem”.
Kompilator zatrzymuje się po pierwszym błędzie . Co?
Brak śladu stosu dla natywnie skompilowanych plików wykonywalnych . Naprawiony.
Debuger jest do bani . Nigdy nie korzystałem z debuggera. Statyczne sprawdzanie typu wyłapuje prawie wszystkie moje błędy.
GC jest do bani . Odkryłem, że GC OCaml jest znakomity, z wyjątkiem jednego poważnego problemu: globalna blokada uniemożliwia programowanie równoległe.
Brak dorozumianych deklaracji forward . Wzajemna rekurencja jest jawna z założenia we wszystkich ML. Jedynym dziwactwem jest to, że type
definicje są domyślnie rekurencyjne, podczas gdy let
wiązania nie są domyślnie rekurencyjne.
Runda funkcyjna jest nieobecna . OCaml wciąż ma standardową zawartość, ale biblioteki stron trzecich, takie jak Core Jane St round
i przyjaciele, zapewniają .
Listy . List.map
wciąż nie jest rekurencyjny. Przesłałem łatki, aby naprawić poważne błędy tego typu i musiałem czekać lata, zanim pojawią się w wydaniach. Oczywiście listy są niezmienne. I tak powinny być.
Prędkość . Wierzę, że czasy kompilacji dużych wariantów polimorficznych zostały naprawione.
Dopasowywanie wzorów . Triumf nadziei nad rzeczywistością. Społeczność Lisp tego nie zrobiła. Stąd moja 10 zasada: każdy wystarczająco skomplikowany program Lisp zawiera ad-hoc, nieformalnie określoną i pozbawioną błędów implementację połowy kompilatora dopasowywania wzorców OCaml.
ale możesz wywołać ładną drukarkę z najwyższego poziomu jako wywołanie biblioteki, podając jej niezbędne informacje o typie. Było też makro, którego można użyć do opisywania struktur danych w celu automatycznego generowania ładnych drukarek.