2009-06-30 7 views
17

Dans l'esprit de:Caractéristiques cachées de Erlang

  • Caractéristiques cachées de C#
  • Caractéristiques cachées de Java
  • Caractéristiques cachées de ASP.NET
  • Caractéristiques cachées de Python
  • Fonctionnalités cachées de HTML
  • et autres questions cachées questions

Quelles sont les caractéristiques cachées d'Erlang que chaque développeur d'Erlang devrait connaître?

Une fonctionnalité cachée par réponse, s'il vous plaît.

+7

S'il vous plaît Community Wiki this. –

+1

Je suggère d'ajouter un tag de fonctionnalités cachées à cela, et de faire des liens sur les fonctionnalités cachées d'autres langues vers ces questions. –

+0

@Olafur comment? Aidez-moi! @Avihu fait. Merci pour la suggestion! :) – pageman

Répondre

19

Les commandes magiques dans le shell. La liste complète est en the manual, mais ceux que j'utilise la plupart sont:

  • f() - oublier toutes les variables
  • f (X) - oublier X
  • v (42) - résultat de rappel de la ligne 42
  • v (-1) - rappel résultat de la ligne précédente
  • e (-1) - expression de réexécuter la ligne précédente
  • rr (foo) - lire les définitions d'enregistrement de modules foo
  • rr ("*/* ") - re définitions record d'annonces de chaque module, dans chaque sous-répertoire
  • rp (d'expression) - imprimer pleine expression avec enregistrement formating
+2

Et en utilisant rp (expression (...)) pour faire imprimer le résultat sans joliment imprimer des structures imbriquées trop profondément, à la place il l'imprime entièrement – Christian

+0

1+ pour rp, Merci – Abhijith

1

Hot code loading. De wiki.

Le code est chargé et géré comme des unités "module", le module est une unité de compilation. Le système peut conserver deux versions d'un module en mémoire en même temps, et les processus peuvent exécuter simultanément du code à partir de chacun d'eux.

Les versions se réfèrent à la "nouvelle" et à la "vieille" version. Un processus ne se déplacera pas dans la nouvelle version tant qu'il n'aura pas effectué d'appel externe à son module.

+12

Comment est-ce une fonctionnalité cachée? Une caractéristique notable à coup sûr, mais c'est l'un des principaux points de gloire de la langue, pas caché du tout. – ryeguy

+0

Mais pourquoi diable aucun upvotes? : D –

12

user_default.erl - vous pouvez construire votre propre builtins shell en ayant un user_default.beam compilé votre chemin qui peut être assez astucieux

4

.erlang peut précharger les bibliothèques et exécuter des commandes sur un démarrage de shells, vous pouvez également faire des commandes spécifiques pour des nœuds spécifiques en faisant une déclaration de cas sur le nom du nœud.

7

.erlang_hosts donne une belle façon de partager les noms à travers des machines

10

beam_lib: morceaux peuvent obtenir le code source d'un faisceau qui a été compilé avec le débogage sur lequel peut être vraiment utile

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

héritage!http://www.erlang.se/euc/07/papers/1700Carlsson.pdf

Parent

-module(parent). 
-export([foo/0, bar/0]). 

foo() -> 
    io:format("parent:foo/0 ~n", []). 

bar() -> 
    io:format("parent:bar/0 ~n", []). 

enfant

-module(child). 
-extends(parent). 
-export([foo/0]). 

foo() -> 
    io:format("child:foo/0 ~n", []). 

Console

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

Je ne sais pas, très utile , Merci! –

+0

Yup. Intéressant! Bien que je ne l'aie jamais vu dans les librairies que j'ai utilisées jusqu'ici ... – bjnortier

+1

Cependant, il n'est pas bienvenu d'utiliser des modules paramétrés: ils ajoutent des variables aux fonctions et ce n'est pas bon quand il s'agit de les déboguer. Ils cassent le paradigme fonctionnel en ajoutant une couche de complexité introduite par les variables que vous devez suivre (comme les variables globales dans les langages impératifs), elles sont immuables mais détruisent la transparence. Il y a eu la pensée qu'ils (modules paramétrés) existent encore dans la langue ** seulement ** à cause des produits qui les utilisent, mochiweb en est un exemple. Pensez-y, pourquoi est apparu en 2003, ils sont encore officiellement sans-papiers? –

14

paramétrés modules! De http://www.lshift.net/blog/2008/05/18/late-binding-with-erlang et http://www.erlang.se/euc/07/papers/1700Carlsson.pdf

-module(myclass, [Instvar1, Instvar2]). 
-export([getInstvar1/0, getInstvar2/0]). 
getInstvar1() -> Instvar1. 
getInstvar2() -> Instvar2. 

Et

Eshell V5.6 (abort with ^G) 
1> Handle = myclass:new(123, 234). 
{myclass,123,234} 
2> Handle:getInstvar1(). 
123 
3> Handle:getInstvar2(). 
234 
+1

J'ai repéré cela quand j'essayais de grok la source de mochiweb. Cela a pris un certain temps pour google ce qu'il faisait réellement, car la syntaxe était totalement différente de l'Erlang que j'ai vu auparavant. – madlep

+1

C'est très intéressant! Je l'ai aussi vu pour la première fois à mochiweb. Combiner cela avec l'héritage pourrait créer des possibilités intéressantes ... – bjnortier

+0

Pour le cas vous vous demandez les downvotes, c'était un accident, s'il vous plaît vérifier [ce méta sujet] (http: //meta.stackexchange.com/questions/50035/vote accidentel). Je vais modifier votre question afin qu'ils puissent être supprimés. – BalusC

8

Que correspondent aux spécifications peuvent être construites en utilisant ets: fun2ms (...) où la syntaxe fun Erlang est utilisé et traduit dans une spécification de correspondance avec une analyse syntaxique transformer.

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

donc sans valeur est amusant jamais construit, l'expression sera remplacé par le spec match lors de la compilation. Le plaisir ne peut faire que des choses qu'une expression de correspondance pourrait faire.

De plus, ets: fun2ms est disponible pour une utilisation dans le shell, de sorte que les expressions amusantes peuvent être testées facilement.

5

Les sockets gen___tcp et ssl disposent d'une option de socket {packet, Type} pour faciliter le décodage d'un certain nombre de protocoles. La fonction erlang:decode_packet/3 a une bonne description de ce que peuvent être les différentes valeurs de Type et de ce qu'elles font.

Avec un paramètre {actif, unique} ou {actif, vrai}, chaque valeur encadrée sera envoyée sous la forme d'un seul message. Exemples: le mode paquet http est utilisé pour iserve et le mode paquet fcgi pour ifastcgi. Je peux imaginer que beaucoup d'autres serveurs http utilisent également le paquet http.

2

Il est possible de définir votre propre itérateur pour l'utilisation de QLC. Par exemple, un jeu de résultats d'une requête SQL peut être transformé en une table QLC et bénéficier ainsi des fonctionnalités des requêtes QLC. En plus des tables mnesia, dets et ets ont les fonctions table/1,2 pour renvoyer un tel "Query Handle" pour eux.

9

Les ports, externes ou intégrés, acceptent ce que l'on appelle des io-listes pour leur envoyer des données. Une io-liste est une liste binaire ou une liste (éventuellement profonde) de binaires ou d'entiers dans la plage 0..255. Cela signifie que plutôt que de concaténer deux listes avant de les envoyer à un port, il suffit de les envoyer sous la forme de deux éléments dans une liste. Ainsi, au lieu de

"foo" ++ "bar" 

on faire

["foo", "bar"] 

Dans cet exemple, il est bien sûr de la différence infime. Mais l'iolist en soi permet une programmation pratique lors de la création de données de sortie. io_lib: format/2,3 lui-même retourne une liste io par exemple.

La fonction erlang: list_to_binary/1 accepte les io listes, mais maintenant nous avons erlang: iolist_to_binary/1 qui traduit mieux l'intention.Il y a aussi un erlang: iolist_size/1.

Le meilleur de tous, puisque les fichiers et les sockets sont implémentés en tant que ports, vous pouvez leur envoyer des iolists. Pas besoin d'aplatir ou d'ajouter.

2

Pas si caché, mais l'un des aspects les plus importants, lors du choix Erlang comme plate-forme pour le développement:

  • Possibilité de ACCRUE suivi sur les nœuds en direct (en service) et d'être l'un des meilleurs dans le débogage !
2

Vous pouvez cacher un nœud Erlang en commençant avec:

erl -sname foo -hidden 

Vous pouvez toujours vous connecter au nœud, mais il ne figurera pas dans la liste renvoyée par nodes/0.

6

Pas nécessairement "caché", mais je ne le vois pas souvent. Les fonctions anonymes peuvent avoir plusieurs clauses, tout comme les fonctions du module, à savoir

-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

assortis avec l'opérateur append:

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

couleur a maintenant la valeur "bleu". Sachez que cette astuce a ses limites - autant que je sache, elle ne fonctionne qu'avec une seule variable et une seule constante dans l'ordre indiqué ci-dessus.

3

Si vous souhaitez exécuter plusieurs expressions dans une liste, vous pouvez utiliser un bloc. Par exemple:

> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)]. 
1 
2 
3 
[10,20,30]