Вы можете проанализировать строку как выражение (аналогично file:consult
) с помощью:
% InputString = "...",
{ok, Scanned, _} = erl_scan:string(InputString),
{ok, Exprs} = erl_parse:parse_exprs(Scanned),
{value, ParsedValue, _} = erl_eval:exprs(Exprs, [])
(см. http://www.trapexit.org/String_Eval)
Вы должны иметь возможность использовать io_lib:format
для преобразования выражения в строку, используя коды формата ~w
или ~p
, например io_lib:format("~w", [{get, "/foo.html"}])
.
Я не думаю, что это будет очень быстро, поэтому, если производительность является проблемой, вы, вероятно, не должны использовать такие строки.
Также обратите внимание, что это потенциально небезопасно, поскольку вы оцениваете произвольные выражения - если вы идете по этому пути, вам, вероятно, следует выполнить некоторые проверки промежуточного вывода. Я бы посоветовал посмотреть на результат erl_parse:parse_exprs
, чтобы убедиться, что он содержит интересующие вас форматы (т. Е. Это всегда кортеж {atom (), list ()}) без вызовов встроенных функций. Вы должны быть в состоянии сделать это с помощью сопоставления с образцом.