2010-10-21 8 views
2

J'essaie d'écrire un serveur simple qui parle aux clients via tcp. Je l'ai envoyé des messages très bien, mais maintenant je veux qu'il interprète les messages comme des types de données Erlang. Par exemple, prétendre que c'est HTTP-like (ce n'est pas) et que je veux envoyer du client {get, "/foo.html"} et que le serveur interprète cela comme un tuple contenant un atome et une liste, au lieu de simplement une grande liste ou un binaire.Version chaîne de term_to_binary

Je finirai probablement par utiliser term_to_binary et binary_to_term, mais le débogage des protocoles textuels est tellement plus facile que j'espérais trouver une version plus conviviale. Y en a-t-il une qui se cache quelque part?

Répondre

4

Vous pouvez analyser une chaîne comme une expression (similaire à file:consult) via:

% InputString = "...", 
{ok, Scanned, _} = erl_scan:string(InputString), 
{ok, Exprs} = erl_parse:parse_exprs(Scanned), 
{value, ParsedValue, _} = erl_eval:exprs(Exprs, []) 

(Voir http://www.trapexit.org/String_Eval)

Vous devriez pouvoir utiliser io_lib:format pour convertir une expression à une chaîne en utilisant la ~w ou ~p codes de format, tels que io_lib:format("~w", [{get, "/foo.html"}]).

Je ne pense pas que ce sera très rapide, donc si les performances sont un problème, vous ne devriez probablement pas utiliser des chaînes comme celle-ci. Notez également que ceci est potentiellement dangereux puisque vous évaluez des expressions arbitraires - si vous suivez cette route, vous devriez probablement faire des vérifications sur la sortie intermédiaire. Je suggère de regarder le résultat de erl_parse:parse_exprs pour vous assurer qu'il contient les formats qui vous intéressent (c'est-à-dire, toujours un tuple de {atom(), list()}) sans appels de fonctions intégrées. Vous devriez être capable de le faire via la correspondance de modèle.

+0

C'est exactement ce que je cherchais. Ceci est pour le débogage et le développement, donc la performance est à peu près un non-problème. Merci. – nmichaels

Questions connexes