tipos - Características ocultas de Erlang
tipos de trafico telefonico (17)
¡Herencia! http://www.erlang.se/euc/07/papers/1700Carlsson.pdf
Padre
-module(parent).
-export([foo/0, bar/0]).
foo() ->
io:format("parent:foo/0 ~n", []).
bar() ->
io:format("parent:bar/0 ~n", []).
Niño
-module(child).
-extends(parent).
-export([foo/0]).
foo() ->
io:format("child:foo/0 ~n", []).
Consola
23> parent:foo().
parent:foo/0
ok
24> parent:bar().
parent:bar/0
ok
25> child:foo().
child:foo/0
ok
26> child:bar().
parent:bar/0
ok
En el espíritu de:
- Características ocultas de C #
- Características ocultas de Java
- Características ocultas de ASP.NET
- Características ocultas de Python
- Características ocultas de HTML
- y otras preguntas sobre características ocultas
¿Cuáles son las características ocultas de Erlang que todos los desarrolladores de Erlang deben conocer?
Una característica oculta por respuesta, por favor.
.erlang puede precargar bibliotecas y ejecutar comandos en un inicio de shells, también puede hacer comandos específicos para nodos específicos haciendo una declaración de caso en nombre de nodo.
.erlang_hosts ofrece una buena forma de compartir nombres entre máquinas
Emparejando con el operador del anexo:
"pajamas:" ++ Color = "pajamas:blue"
El color ahora tiene el valor "azul". Tenga en cuenta que este truco tiene sus limitaciones; por lo que sé, solo funciona con una sola variable y una única constante en el orden indicado anteriormente.
Es posible definir su propio iterador para que lo use QLC. Por ejemplo, un conjunto de resultados de una consulta SQL podría hacerse en una tabla QLC, y así beneficiarse de las características de las consultas QLC.
Además de las tablas de mnesia, dets y ets tienen las funciones de tabla / 1,2 para devolver tal "Manejador de consultas" para ellos.
La magia manda en la concha. La lista completa está en el manual , pero las que más uso son:
- f () - olvida todas las variables
- f (X) - olvida X
- v (42) - recuperar el resultado de la línea 42
- v (-1) - recuperar el resultado de la línea anterior
- e (-1) - volver a ejecutar la expresión en la línea anterior
- rr (foo) - lee las definiciones de los registros del módulo foo
- rr ("* / *") - lea las definiciones de registro de cada módulo en cada subdirectorio
- rp ( expresión ) - imprime la expresión completa con formato de registro
Las especificaciones de coincidencia se pueden crear utilizando ets: fun2ms (...) donde se utiliza la sintaxis de Erlang fun y se traduce en una especificación de coincidencia con una transformación de análisis.
1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end).
[{{''$1'',''_'',''$2''},[{''>'',''$1'',0}],[{{''$1'',''$2''}}]}]
Por lo tanto, nunca se construye un valor de diversión, la expresión se reemplaza con la especificación de coincidencia en tiempo de compilación. La diversión solo puede hacer cosas que una expresión de coincidencia podría hacer.
Además, ets: fun2ms está disponible para su uso en el shell, por lo que las expresiones divertidas se pueden probar fácilmente.
Los puertos, externos o vinculados, aceptan algo llamado io-lists para enviarles datos. Una lista io es una lista binaria o (posiblemente profunda) de binarios o enteros en el rango 0..255.
Esto significa que en lugar de concatenar dos listas antes de enviarlas a un puerto, uno puede simplemente enviarlas como dos elementos en una lista. Así que en lugar de
"foo" ++ "bar"
uno hace
["foo", "bar"]
En este ejemplo es, por supuesto, de minúscula diferencia. Pero el iolist en sí mismo permite una programación conveniente al crear datos de salida. io_lib: el formato / 2,3 en sí mismo devuelve una lista de io, por ejemplo.
La función erlang: list_to_binary / 1 acepta las listas io, pero ahora tenemos erlang: iolist_to_binary / 1 que transmite mejor la intención. También hay un erlang: iolist_size / 1.
Lo mejor de todo , ya que los archivos y sockets se implementan como puertos, puede enviarles listas de correo. No hay necesidad de aplanar o añadir.
Los sockets gen___tcp y ssl tienen una opción de {paquete, tipo} para ayudar a decodificar varios protocolos. La función erlang:decode_packet/3 tiene una buena descripción de lo que pueden ser los distintos valores de Tipo y lo que hacen.
Junto con una configuración {activa, una vez} o {activa, verdadera}, cada valor enmarcado se entregará como un solo mensaje.
Ejemplos: el modo http del paquete se usa mucho para iserve y el modo fcgi del paquete para ifastcgi . Puedo imaginar que muchos de los otros servidores http también usan paquetes http.
Módulos parametrizados! De http://www.lshift.net/blog/2008/05/18/late-binding-with-erlang y http://www.erlang.se/euc/07/papers/1700Carlsson.pdf
-module(myclass, [Instvar1, Instvar2]).
-export([getInstvar1/0, getInstvar2/0]).
getInstvar1() -> Instvar1.
getInstvar2() -> Instvar2.
Y
Eshell V5.6 (abort with ^G)
1> Handle = myclass:new(123, 234).
{myclass,123,234}
2> Handle:getInstvar1().
123
3> Handle:getInstvar2().
234
No necesariamente "oculto", pero no veo esto a menudo. Las funciones anónimas pueden tener múltiples cláusulas, al igual que las funciones de módulo, es decir,
-module(foo).
-compile(export_all).
foo(0) -> "zero";
foo(1) -> "one";
foo(_) -> "many".
anon() ->
fun(0) ->
"zero";
(1) ->
"one";
(_) ->
"many"
end.
1> foo:foo(0).
"zero"
2> foo:foo(1).
"one"
3> foo:foo(2).
"many"
4> (foo:anon())(0).
"zero"
5> (foo:anon())(1).
"one"
6> (foo:anon())(2).
"many"
No tan oculto, pero uno de los aspectos más importantes, al elegir Erlang como plataforma para el desarrollo:
- Posibilidad de rastreo mejorado en nodos en vivo (en servicio) y de ser uno de los mejores en depuración.
Puedes ocultar un nodo de Erlang iniciándolo con:
erl -sname foo -hidden
Aún puede conectarse al nodo, pero no aparecerá en la lista devuelta por los nodes/0
.
Si desea ejecutar más de una expresión en una lista de comprensión, puede usar un bloque. Por ejemplo:
> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)].
1
2
3
[10,20,30]
beam_lib: los trozos pueden obtener el código fuente de un haz compilado con depuración en el que puede ser realmente útil
{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
user_default.erl - puedes construir tus propios shell construidos al tener un user_default.beam compilado en tu ruta que puede ser bastante ingenioso
Código de carga en caliente. De wiki.
El código se carga y se administra como unidades de "módulo", el módulo es una unidad de compilación. El sistema puede mantener dos versiones de un módulo en la memoria al mismo tiempo, y los procesos pueden ejecutar simultáneamente el código de cada uno.
Las versiones se refieren a la versión "nueva" y la versión "antigua". Un proceso no se moverá a la nueva versión hasta que realice una llamada externa a su módulo.