В 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)).
1 ответ
Решение
Вам просто нужно 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)).