Respuestas:
Hay muchas diferencias, algunas técnicas, otras sociopolíticas. Intenté poner primero las diferencias más importantes.
SML es un lenguaje con una definición y un estándar. Es estable (y de hecho se ha congelado por lo que no puede evolucionar). Objective Caml es una implementación controlada por un pequeño grupo en INRIA. Sigue evolucionando. (En mi opinión, la evolución se gestiona bien).
SML tiene muchas implementaciones; Caml solo tiene uno.
Objective Caml tiene una serie de características adicionales, entre las que las más destacadas son probablemente objetos y variantes polimórficas.
Los dos lenguajes tienen modelos de tipos de registros dramáticamente diferentes. Brevemente, en Caml, los nombres de los campos de registro deben ser únicos, mientras que en SML, dos tipos de registros diferentes en el mismo ámbito pueden tener nombres de campo en común. Esta peculiaridad puede hacer que la migración de SML a Caml sea un poco complicada.
Hay bastantes diferencias sintácticas.
Las bibliotecas y las funciones estándar son dramáticamente diferentes. La biblioteca Caml es muy importante, mientras que la biblioteca básica estándar SML es más funcional. Por ejemplo, la composición de funciones es una primitiva de nivel superior en SML; no forma parte de la biblioteca Caml. La biblioteca de cadenas de Caml no proporciona una función de plegado (al menos no a partir de la versión 3.08). Las implementaciones de muchas de las List
funciones de Caml no son seguras para listas muy largas; ellos soplan la pila.
Los sistemas de tipos son sutilmente diferentes: en Caml, e : ty
se acepta una anotación de tipo en una expresión si el tipo se ty
unifica con el tipo de e
. En SML, e : ty
solo se acepta si el tipo ty
es una instancia del tipo de e
. Esta distinción hace que la anotación en Caml sea mucho menos útil en la práctica, porque es imposible utilizar una anotación de tipo para insistir en que una expresión es polimórfica.
Caml tiene una relación mucho más sensata y sensata entre interfaces (llamadas tipos de módulo o firmas ) e implementaciones (concretas) (llamadas módulos o estructuras ) que SML. En SML prácticamente todo vale y hay que confiar en el programador para establecer buenas convenciones. En Caml, el compilador establece y aplica buenas convenciones.
En SML, los operadores aritméticos están sobrecargados para aplicarlos a datos enteros y de punto flotante. En Caml, los operadores no están sobrecargados; Los operadores de punto flotante se anotan con un punto adicional.
En SML, el programador puede controlar la precedencia y la asociación de los operadores infijos. En Caml, estos están determinados por el primer carácter del nombre del operador. Esta restricción limita los beneficios de poder definir su propia notación infija.
Para un análisis más detallado completo con comentarios editoriales, también puede consultar la página de comparación de Adam Chlipala .
e : 'a . ty(a)
es posible y significativa.
Para obtener detalles sobre las diferencias sintácticas que mencionó Norman Ramsey, aquí hay un par de páginas web:
OCaml agrega características de orientación a objetos y tiene algunas diferencias de sintaxis menores.