2009-01-10 13 views
10

Solo quiero saber todos los pequeños problemas que surgieron entre usted y su solución final cuando era nuevo en Erlang.Aprender Erlang? threadbump thread, common, small problems

Por ejemplo, aquí están los primeros speedbumps que tenía:

  1. Uso controlling_process (Socket, PID) si fuera desovar en varios subprocesos. Paquete correcto al hilo derecho.
  2. ¿Vas a empezar a hablar con otro servidor? Recuerde net_adm: ping ('car @ bsd-server'). en el caparazón. De lo contrario, ninguna comunicación se transmitirá.
  3. Temporizador: suspensión (10), si no desea hacer nada. Siempre es útil cuando se depura.
+0

Buena pregunta Joe, pero usted debe tener sus respuestas como respuestas o mantenerlas en su pregunta, no ambas. Preferiblemente, deberían ser respuestas. – ryeguy

Respuesta

1

controlling_process()

Uso controlling_process (Socket, PID) si fuera desovar en varios subprocesos. Paquete correcto al hilo derecho.

1

net_adm: mesa de ping()

Usted va 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á.

0

temporizador: el sueño()

Pausa para X ms.

0

Lo que más tiempo me tomó para entender fue simplemente la idea de estructurar mi código completamente alrededor 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).

2

Integrarlo en msvc 6, así que podría usar el editor y ver los resultados en la ventana de resultados.

creé una herramienta, con

comando - camino a CELR

argumentos - + DEBUG_INFO $ (nombre del archivo) $ (FileExt)

Directorio inicial - $ (fileDir)

Marcados Utilice la ventana de salida.

5
  • Aprender a navegar por la documentación estándar

    Una vez que aprender cómo se organiza la documentación OTP se hace mucho más fácil encontrar lo que estás buscando (que tienden a necesitar aprender las aplicaciones que proporcionan que los módulos o tipos de módulos).

    también navegando a la documentación de las aplicaciones es a menudo muy gratificante - He descubierto una gran cantidad de código realmente útil de esta manera - sys, dbg, toolbar, etc.

  • La diferencia entre erlang shell y erlang módulo

    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.

    Aprendiendo la interacción entre el intérprete de comandos y los procesos {start, spawn} _link ed: cuando ejecuta algún código del shell que se cuelga (provoca una excepción), el proceso del shell finaliza y transmite 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é sigue mi proceso de servidor de desaparecer?")

  • La diferencia entre las expresiones de Erlang y expresiones de guardia

    expresiones de la Guardia (cláusulas) cuando no son expresiones de Erlang. Pueden parecer similares, pero son bastante diferentes. Los guardias no pueden invocar funciones de 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.

  • carga Código

    La elaboración de cuándo y cómo funcionan las actualizaciones de código, el encantamiento 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.

  • código Erlang Edificio

    La elaboración de una combinación útil de emake (make:all/0 y erl -make) y hacer GNU tomó un tiempo bastante largo (alrededor de tres años hasta el momento :).

    Mis favoritos actuales archivos make se pueden ver en http://github.com/archaelus/esmtp/tree/master

  • distribución Erlang

    Obtención de nombres de nodo, DNS, galletas y todo el resto derecho con el fin de ser capaz de net_adm:ping/1 el otro nodo. Esto requiere práctica.

  • complejidades cáscara S remotas

    Recordando a pasar group_leader() a io:format llamadas se ejecutan en el nodo remoto para que la salida aparece en su shell en lugar de desaparecer misteriosamente (creo que el navegador informe SASL rb todavía tiene un problema con el envío de algunos de su salida al nodo incorrecto cuando se utiliza en una conexión de shell remoto)

2
  • depuración es duro. 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 por mi propia culpa, pero: empecé a codificar antes de que entendiera eunit, por lo que gran parte de mi código es más difícil de lo que debería ser.