programacion - erlang vs elixir
¿Aprendiendo Erlang? threadbump thread, problemas comunes, pequeños (7)
controlling_process ()
Utilice controlling_process (Socket, Pid) si genera en múltiples hilos. Paquete correcto al hilo derecho.
Solo quiero saber todos los pequeños problemas que se interpusieron entre usted y su solución final cuando era nuevo en Erlang.
Por ejemplo, aquí están los primeros speedbumps que tuve:
- Utilice controlling_process (Socket, Pid) si genera en múltiples hilos. Paquete correcto al hilo derecho.
- ¿Vas a comenzar a hablar con otro servidor? Recuerde net_adm: ping (''car @ bsd-server''). en el caparazón. De lo contrario, ninguna comunicación se transmitirá.
- Temporizador: dormir (10), si no quiere hacer nada. Siempre es útil cuando se depura.
net_adm: ping ()
¿Vas a comenzar a hablar con otro servidor? Recuerde net_adm: ping (''car @ bsd-server''). en el caparazón. De lo contrario, ninguna comunicación se transmitirá.
temporizador: dormir ()
Pausa por X ms
Lo que más tiempo me tomó para entender fue la idea de estructurar mi código completamente en función de las llamadas a funciones y el envío de mensajes. El resto se cayó desde allí (desove, nodos remotos) o se sintió como las cosas habituales que tienes que aprender en cualquier idioma nuevo (sintaxis, stdlib).
Integrarlo en msvc 6, así que podría usar el editor y ver los resultados en la ventana de salida.
Creé una herramienta, con
comando - ruta a erlc
argumentos - + debug_info $ (FileName) $ (FileExt)
Directorio inicial - $ (fileDir)
Ventana de salida de uso revisada .
Aprendiendo a navegar por la documentación estándar
Una vez que sepa cómo está organizada la documentación de OTP, será mucho más fácil encontrar lo que está buscando (usted tiende a necesitar saber qué aplicaciones proporcionan qué módulos o tipos de módulos).
Además, la simple exploración de la documentación de las aplicaciones suele ser muy gratificante: descubrí muchos códigos realmente útiles de esta forma:
sys
,dbg
,toolbar
, etc.La diferencia entre shell erlang y module erlang
Shell erlang es un dialecto ligeramente diferente al módulo erlang. No puede definir funciones de módulo (solo funs), necesita cargar definiciones de registros para trabajar con registros (
rr/1
), etc. Aprender cómo escribir el código de erlang en términos de funciones anónimas es algo complicado, pero es esencial para trabajar en sistemas de producción con un shell remoto.Aprender la interacción entre el shell y los procesos {start, spawn} _link ed: cuando ejecuta algún código de shell que falla (genera una excepción), el proceso de shell finaliza y transmite las señales de salida a todo lo que haya vinculado. Esto a su vez apagará el nuevo gen_server en el que está trabajando. ( "¿Por qué el proceso de mi servidor sigue desapareciendo?" )
La diferencia entre las expresiones de erlang y las expresiones de guardia
Las expresiones Guard (cuando las cláusulas) no son expresiones Erlang. Pueden parecer similares, pero son bastante diferentes. Los guardias no pueden invocar funciones erlang arbitrarias, solo funciones de protección (
length/1
, las pruebas de tipo,element/2
y algunas otras especificadas en la documentación de OTP). Los guardias tienen éxito o fracasan y no tienen efectos secundarios. Las expresiones de Erlang, por otro lado, pueden hacer lo que quieran.Código de carga
Averiguar cuándo y cómo funcionan las actualizaciones de código, el conjuro para obtener un gen_server para actualizar a la última versión de un módulo de devolución de llamada (
code:load(Mod), sys:suspend(Pid), sys:change_code(Pid, Mod, undefined, undefined), sys:resume(Pid).
).La ruta del servidor de código (
code:get_path/0
) - No puedo contar cuántas veces me encontré con errores de función indefinidos que resultaron ser me olvidé de agregar un directorio ebin a la ruta de búsqueda de código.Construyendo código de erlang
Desarrollar una combinación útil de emake (
make:all/0
yerl -make
) y gnu make tomó bastante tiempo (aproximadamente tres años hasta ahora :).Mis archivos make favoritos actuales se pueden ver en http://github.com/archaelus/esmtp/tree/master
Distribución Erlang
Obtención de nombres de nodo, DNS, cookies y todo lo demás para poder
net_adm:ping/1
el otro nodo. Esto requiere práctica.Entornos de IO de shell remoto
Recordar pasar
group_leader()
aio:format
llamadas ejecutadas en el nodo remoto para que la salida aparezca en su shell en lugar de desaparecer misteriosamente ( creo que el navegador de informes SASLrb
todavía tiene un problema al enviar parte de su salida al nodo incorrecto cuando se usa sobre una conexión de shell remota )
- La depuración es difícil. Todo lo que sé hacer es pegar llamadas a "error_logger: info_msg" en mi código.
- Los documentos han sido imprecisos, son correctos, pero muy muy escuetos.
- Esto es culpa mía, pero: empecé a codificar antes de entender la unidad, por lo que gran parte de mi código es más difícil de lo que debería ser.