[erlang-questions] Pattern-matching function?

mats cronqvist <>
Mon Nov 3 15:00:44 CET 2008


"anders conbere" <> writes:

> On Thu, Oct 30, 2008 at 12:28 PM, Steve Vinoski <> wrote:
>> On 10/30/08, anders conbere <> wrote:
[...]
> That being said I would love to be able to do
> URLS = [{module, roto_web_view}
>         {[],                                version},
>         {["version"],                       version},
>         {["register"],                      register},
>         {["nodes"],                         get_nodes},
>         {["nodes", NodeName],               nodes};
>         {["nodes", NodeName, "queues"],     queues};
>         {["nodes", NodeName, "messages"],   messages};
>         ],

  like this?
1> deep_match:dm("/nodes/foo/queues/").
{queues,["foo"]}
2> deep_match:dm("/version/").
version


%% -*- erlang-indent-level: 2 -*-
%%% Created :  3 Nov 2008 by Mats Cronqvist <>

%% @doc
%% @end

-module('deep_match').
-author('Mats Cronqvist').
-export([dm/1]).

matches() ->[{[],			fun version/1},
	     {["version"],		fun version/1},
	     {["register"],		fun register/1},
	     {["nodes"],		fun get_nodes/1},
	     {["nodes", ''],		fun nodez/1},
	     {["nodes", '', "queues"],	fun queues/1},
	     {["nodes", '', "messages"],fun messages/1}
	    ].

dm(Str) -> until(string:tokens(Str,"/"),matches()).
  
until(Toks,[]) -> exit({no_match,Toks});
until(Toks,[{CandToks,CandFun}|Cands]) ->
  try CandFun(deep_match(Toks,CandToks))
  catch _:_ -> until(Toks,Cands)
  end.

deep_match([],[]) -> [];
deep_match([T|Toks],[T|CandToks]) -> deep_match(Toks,CandToks);
deep_match([T|Toks],[T|CandToks]) -> deep_match(Toks,CandToks);
deep_match([T|Toks],[''|CandToks]) -> [T|deep_match(Toks,CandToks)].

version([])->version.
register([])->register.
get_nodes([])->get_nodes.
nodez(X)->{nodes,X}.
queues(X)->{queues,X}.
messages(X)->{messages,X}.



More information about the erlang-questions mailing list