Ложное чувство безопасности . Это нонсенс.
Несколько основных типов . В OCaml теперь есть байты и байтовые массивы, но нет встроенных юникодных строк, 16-битных целых, беззнаковых целых, 32-битных чисел с плавающей точкой, векторов или матриц. Сторонние библиотеки предоставляют некоторые из них.
Silent Integer Overflow . Без изменений, но это никогда не было проблемой.
Неизменность модуля . Его рекомендация, что функции и модули должны быть изменяемыми, является мрачным возвратом к Lisp и действительно плохой идеей. Вы можете заменить модули, используя, include
если хотите, но, конечно, не можете изменять их.
Полиморфизм вызывает ошибки типа времени выполнения . Это большая проблема с OCaml, и она не была исправлена. Поскольку ваши типы развивают полиморфное равенство, сравнение и хеширование начинают терпеть неудачу, когда они сталкиваются с такими типами, как функции, и отладка проблемы становится очень сложной. У F # есть отличное решение этой проблемы.
Нет макросов . По иронии судьбы, когда он писал этот OCaml, он полностью поддерживал макросы, но теперь они решили использовать эту функцию.
Упаковщики . Это была настоящая проблема, и она не была исправлена. В try ... finally
языке OCaml до сих пор нет конструкции и нет оболочки, реализующей ее в stdlib.
Места . Без изменений, но не проблема.
Запись поля именования ада . Структурируйте свой код правильно, используя модули.
Синтаксис . Без изменений, но не проблема.
Полиморфизма нет . В основном это была ерунда, когда он это написал, и ничего не изменилось.
Несовместимые наборы функций . OCaml до сих пор не имеет cons
функции. Все в порядке. Я не хочу, чтобы Лисп на моем языке, спасибо.
Нет динамических переменных . Была хорошая вещь об OCaml. Все еще хорошая вещь об OCaml.
Необязательные аргументы ~ отстой . Необязательные аргументы рок. Я подписал Microsoft, чтобы они добавили необязательные аргументы в F #.
Частичное несоответствие приложения аргументу . А?
Читаемость арифметики . Это изменилось с тех пор, как я перестал использовать OCaml ~ 8 лет назад. Видимо, теперь вы можете сделать Int64.((q * n - s * s) / (n - 1L))
.
Бесшумное разрешение конфликтов имен . Он пытался сделать полноценную разработку программного обеспечения в REPL, как вы это делали в Lisp. Не делай этого в OCaml. Используйте файлы и пакетную компиляцию, прибегая к REPL, только для тестирования, запуска одноразового кода и интерактивных технических вычислений.
Порядок оценки . Это было неправильно, когда он написал это. Порядок оценки не определен в OCaml.
Нет ввода / вывода объекта . Он привел стороннюю библиотеку, которая уже решила эту «проблему».
Компилятор останавливается после первой ошибки . А?
Нет трассировки стека для изначально скомпилированных исполняемых файлов . Исправлена.
Отладчик отстой . Я никогда не использовал отладчик. Статическая проверка типов ловит почти все мои ошибки.
GC отстой . Я нашел GC OCaml превосходным, за исключением одной главной проблемы: глобальная блокировка предотвращает параллельное программирование.
Нет неявных предварительных объявлений . Взаимная рекурсия явно предусмотрена во всех ML. Единственным недостатком является то, что type
определения являются рекурсивными по умолчанию, тогда как let
привязки не являются рекурсивными по умолчанию.
Функция обхода отсутствует . В OCaml все еще есть простой stdlib, но сторонние библиотеки, такие как Jane St's Core round
и друзья.
Списки . List.map
все еще не хвостовой рекурсив Я представил патчи, чтобы исправить серьезные ошибки, подобные этой, и мне пришлось ждать годы, прежде чем они появятся в релизах. Списки все еще неизменны, конечно. И так должно быть.
Скорость . Я считаю, что время компиляции для больших полиморфных вариантов было исправлено.
Сопоставление с образцом . Торжество надежды над реальностью. Сообществу Lisp не удалось этого сделать. Отсюда мое 10-е правило: любая достаточно сложная программа на Лиспе содержит специальную, неофициально заданную и ошибочную реализацию половины компилятора сопоставления с образцами OCaml.
но вы можете вызвать симпатичный принтер с верхнего уровня как библиотечный вызов, предоставив ему необходимую информацию о типе. И был макрос, который вы можете использовать для аннотирования структур данных, чтобы автоматически создавать красивые принтеры.