一个蛮简单的程序 输入一串字符串(list)然后执行:
-module(list_apply). -export([apply/1]). apply(Str) -> re_run(Str). re_run(Str) -> Res=re:run(Str,"\\s*(.*)\\s*:\\s*(.*)\\((.*)\\)\\.",[{capture,[1,2,3],list}]), case Res of nomatch -> io:format("输入有误"); {match,[M,F,A]} -> do_apply(string:strip(M),string:strip(F),A) end. do_apply(M,F,A) -> try {ok,Token,_}=erl_scan:string("["++ A ++"]."), {ok,Terms}=erl_parse:parse_term(Token), erlang:apply(list_to_atom(M),list_to_atom(F),Terms) catch error:Case -> io:format("error:~p~n",[Case]) end.
代码比较简单
先用正则匹配一下 匹配成功并抽取模块 函数和参数 接下去就做参数的解析
参数的解析使用了erl_scan:string/1先变成tokens的形式 然后转给erl_parse的parse_term/1处理
为了方便直接进行异常处理
这边的string:strip/1是去除string(list)前后的空格 用ungreedy模块那边的空格是去得掉 但是函数前的空格居然还是会被保留的跪Orz...
输入输出如下:
22> c(list_apply). {ok,list_apply} 23> list_apply:apply("erlang:time()."). {14,7,38} 24> list_apply:apply("string:strip(\"ac \")."). "ac" 25> list_apply:apply("erlang:time(12)."). %erlang:time/1这个函数不存在的 error:undef ok 2> list_apply:apply("io:format(\"hello~p~n\",[\"nihao\"])."). hello"nihao" ok 3> list_apply:apply("io : format(\"hello~p~n\",[\"nihao\"])."). hello"nihao" ok