2013-07-03 2 views
2

Я действительно не мог сформулировать вопрос лучше, но вот моя проблема: Я хочу использовать код this для преобразования выражения infix в постфиксное выражение в Erlang, но он только записывает на вывод консоли. Проблема в том, что мне нужен список или строка, возвращаемая, поэтому я могу использовать ее в качестве аргумента в другой функции.В Erlang, как вернуть строку при использовании рекурсии?

-module(foo). 
-compile(export_all). 

parse(Str) ->  
    {ok, Tokens, _} = erl_scan:string(Str ++ "."), 
    {ok, [E]} = erl_parse:parse_exprs(Tokens), 
    E. 

rpn({op, _, What, LS, RS}) -> 
    rpn(LS), 
    rpn(RS), 
    io:format(" ~s ", [atom_to_list(What)]); 
rpn({integer, _, N}) -> 
    io:format(" ~B ", [N]). 

p(Str) -> 
    Tree = parse(Str), 
    rpn(Tree), 
    io:format("~n"). 

Например, я хочу коснуться, как это:

Str = "2 * (3 + 4)". 
module:p(Str) =:= "2 3 4 + *". 
module:anotherFunction(p(Str)). 

ответ

5

Вам просто нужно io_lib:format/2 вместо io:format/2 и lists:flatten/1 в конце концов.

-module(foo). 
-compile(export_all). 

parse(Str) -> 
    {ok, Tokens, _} = erl_scan:string(Str ++ "."), 
    {ok, [E]} = erl_parse:parse_exprs(Tokens), 
    E. 

rpn({op, _, What, LS, RS}) -> 
    io_lib:format("~s ~s ~s", [rpn(LS), rpn(RS), atom_to_list(What)]); 
rpn({integer, _, N}) -> 
    io_lib:format("~b", [N]). 

p(Str) -> 
    Tree = parse(Str), 
    lists:flatten(rpn(Tree)).