2009-06-30 24 views
17

En el espíritu de:características ocultas de Erlang

  • 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 ocultas preguntas

¿Cuáles son las características ocultas de Erlang que todo desarrollador de Erlang debe conocer?

Una función oculta por respuesta, por favor.

+7

Please Community Wiki this. –

+1

Sugiero agregar una etiqueta de características ocultas a esto y hacer que las notas sobre las funciones ocultas de otros idiomas vinculen a esas preguntas. –

+0

@Olafur ¿cómo? ¡ayuda! @Avihu hecho. ¡Gracias por la sugerencia! :) – pageman

Respuesta

19

Los comandos mágicos en el shell. La lista completa está en the manual, pero los que más utilizo son:

  • f() - olvidar todas las variables
  • f (x) - olvidar X
  • V (42) - Resultado de recuperación de la línea 42
  • v (-1) - resultado de recuperación de la línea anterior
  • e (-1) - expresión volver a ejecutarlo en la línea anterior
  • rr (foo) - leer las definiciones de registro de módulo foo
  • rr ("*/* ") - re las definiciones de registro de anuncios de todos los módulos en cada subdirectorio
  • rp (expresión) - imprimir la expresión completa con formateo de registro
+2

Y usando rp (expresión (...)) para imprimir el resultado sin una bonita impresión de estructuras muy anidadas, en su lugar lo imprime completamente – Christian

+0

1+ para rp, Gracias – Abhijith

1

Hot code loading. De wiki.

El código se carga y 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 código de cada uno.

Las versiones se refieren a la versión "nueva" y a la "antigua". Un proceso no se moverá a la nueva versión hasta que realice una llamada externa a su módulo.

+12

¿Cómo es esta función oculta? Una característica notable de seguro, pero este es uno de los principales puntos de jactancia del lenguaje, no está oculto en absoluto. – ryeguy

+0

¿Pero por qué diablos no hay votaciones? : D –

12

user_default.erl - usted puede construir sus propias órdenes internas por tener un user_default.beam compilado en su ruta que puede ser bastante ingeniosa

4

.erlang puede precargar bibliotecas y ejecutar comandos en un inicio de shells, también puede hacer comandos específicos para nodos específicos al hacer una declaración de caso en el nombre del nodo.

7

.erlang_hosts da una buena manera de compartir nombres a través de máquinas

10

beam_lib: trozos pueden obtener el código fuente de una viga que se compiló con la depuración en la que puede ser realmente muy útil

{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]). 
    io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]). 
25

herencia!http://www.erlang.se/euc/07/papers/1700Carlsson.pdf

Padres

-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 
+0

No lo sé, muy útil , ¡Gracias! –

+0

Sí. ¡Interesante! Aunque no lo he visto en ninguna biblioteca que haya usado hasta la fecha ... – bjnortier

+1

Sin embargo, no es bienvenido el uso de módulos parametrizados: agregan variables a las funciones y no es bueno a la hora de depurarlas. Rompen el paradigma funcional y agregan una capa de complejidad introducida por variables que debe tener en cuenta (como variables globales en lenguajes imperativos), son inmutables pero destruyen la transparencia. Se ha pensado que ellos (módulos parametrizados) aún existen en el idioma ** solo ** debido a los productos que los utilizan, mochiweb es un ejemplo. Solo piensen, ¿por qué apareció en 2003 todavía oficialmente indocumentado? –

14

parametrizado Módulos! 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 
+1

Lo vi cuando estaba intentando asimilar la fuente de mochiweb. Tomó un tiempo para googlear qué demonios estaba haciendo en realidad, ya que la sintaxis era totalmente diferente a la de Erlang que he visto antes. – madlep

+1

¡Es bastante interesante! También lo vi por primera vez en mochiweb. Combinar esto con la herencia podría crear algunas posibilidades interesantes ... – bjnortier

+0

Para el caso en que se preguntan los votos a la baja, esto fue un accidente, por favor revise [este meta tema] (http: //meta.stackexchange.com/questions/50035/accidental-voting). Editaré tu pregunta para que puedan eliminarse. – BalusC

8

que las especificaciones de los partidos pueden ser construidos usando ETS: fun2ms (...), donde se utiliza la sintaxis diversión Erlang y se traduce en una especificación partido con un análisis sintáctico transformar.

1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end). 
[{{'$1','_','$2'},[{'>','$1',0}],[{{'$1','$2'}}]}] 

Por lo tanto, nunca se ha creado ningún valor de diversión, la expresión se reemplaza con la coincidencia en tiempo de compilación. La diversión solo puede hacer cosas que la expresión de un partido 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.

5

Los sockets gen___tcp y ssl tienen una opción de socket {packet, Type} para ayudar a decodificar una serie de protocolos. La función erlang:decode_packet/3 tiene una buena descripción de lo que pueden ser los diferentes 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 de paquete http se utiliza en gran medida para iserve y el modo de paquete fcgi para ifastcgi. Me puedo imaginar que muchos de los otros servidores http también usan paquetes http.

2

Es posible definir su propio iterador para QLC. Por ejemplo, un conjunto de resultados de una consulta SQL podría convertirse en una tabla QLC, y así beneficiarse de las características de las consultas QLC.

Además las tablas de mnesia, dets y ets tienen las funciones de tabla/1,2 para devolver un "Manejador de consulta" para ellas.

9

Los puertos, externos o vinculados, aceptan algo llamado io-lists para enviar datos a ellos. Una io-list es una lista binaria o una (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, una puede simplemente enviarlas como dos elementos en una lista. Así que en lugar de

"foo" ++ "bar" 

uno hacer

["foo", "bar"] 

En este ejemplo es, por supuesto, de la diferencia minúscula. Pero el iolist en sí mismo permite una programación conveniente cuando se crean datos de salida. io_lib: format/2,3 devuelve, por ejemplo, una lista io.

La función erlang: list_to_binary/1 acepta io lists, pero ahora tenemos erlang: iolist_to_binary/1 que comunica mejor la intención.También hay un erlang: iolist_size/1.

Lo mejor de todo es que, dado que los archivos y las tomas de corriente se implementan como puertos, puede enviarles iolists. No es necesario aplanar o anexar.

2

No tan oculto, pero uno de los aspectos más importantes, cuando eligiendo Erlang como plataforma para el desarrollo:

  • Posibilidad de una mayor seguimiento en los nodos en vivo (en servicio) y siendo uno de los mejores de la depuración !
2

Usted puede ocultar un nodo Erlang iniciando con:

erl -sname foo -hidden 

Todavía se puede conectar con el nodo, pero no aparecerán en la lista devuelta por nodes/0.

6

No necesariamente "oculto", pero no veo esto a menudo. Las funciones anónimas pueden tener varias cláusulas, al igual que las funciones del 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" 
2

a juego con el operador de agregación:

"pajamas:" ++ Color = "pajamas:blue"

color ahora tiene el valor "azul". Tenga en cuenta que este truco tiene sus limitaciones: hasta donde sé, solo funciona con una sola variable y una sola constante en el orden indicado anteriormente.

3

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]