`

[练习]erlang编程练习2:apply使用

 
阅读更多

一个蛮简单的程序 输入一串字符串(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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics