Erlang es un lenguaje dinámico. Sin embargo, es una buena práctica hacer la verificación de tipos y el análisis estático post-compilación.
La herramienta Dialyzer se utiliza para verificar este tipo de condición de error.
El motivo por el que el compilador no lo conoce en tiempo de compilación es porque las funciones se pueden buscar y cargar dinámicamente desde la ruta del código en tiempo de ejecución (y también desde un nodo remoto). El dializador comprobará el código contra la ruta del código en el momento en que se ejecuta.
La capacidad de cargar código desde un nodo remoto significa que los 'sistemas' básicos pueden instalarse en un dispositivo y luego el dispositivo puede arrancarse desde la red.
También debe recordar otra de las características de Erlang que se puede generar llamadas de función on the fly usando construcciones como:
erlang:apply(ModuleName, FunctionName, ArgList)
por lo que en ese caso, simplemente no es posible saber si la función existe en tiempo de compilación o no .
Y aunque el módulo y la función pueden existir ahora en tiempo de compilación, puede intercambiar módulos en caliente y descargar el código, por lo que puede no estar allí en tiempo de ejecución.
No solo la ruta del código sino otros nodos en un clúster de Erlang.El código no tiene que ser local para ser cargado en una VM de Erlang y ejecutado. –
Realmente no había pensado en eso. Una mirada rápida al libro de cocina de Erlang muestra cómo hacerlo. http://www.trapexit.org/Remote_Code_Load –
Además, puede reemplazar o descargar el módulo en tiempo de ejecución, por lo que incluso si el compilador lo comprobara ahora, aún podría fallar más tarde. – archaelus