在erlang函数中通过变量名检索值

时间:2013-12-20 16:28:58

标签: erlang

是否有可能以某种方式通过名称检索变量值(名称表示为字符串)?

% we are calling foo function as foo(3)
foo(Param) ->
    Var1 = Param * 2,
    % some magic code here which can evaluate 
    % "Var1" string to Var1's value (6)
    ok.

我想实现(如果可能的话)某种记录器宏,比如

Param = 3*4,
% This should write "My parameter value is 12" to log
?LOG("My parameter value is $Param"). 

感谢。

3 个答案:

答案 0 :(得分:1)

记录的常用方法是使用格式化字符串和参数列表。但是,通过使用解析变换,您的想法是可以实现的。

答案 1 :(得分:0)

对于您可以使用的玩具问题:

io:format("My parameter value is ~p~n", [Param]).

请参阅io_libio

可替换地:

error_logger:info_report/1

或其他error_logger函数。

常用日志库lager

答案 2 :(得分:0)

感谢Dmitry Belyaev提到解析变换。 假设我们有日志代码:

?dump("My parameter value is $Param")

我需要的是用一些正则表达式解析格式字符串中的变量(“我的参数值是$ Param”)。此格式字符串包含单个var名称(Param)。我们需要使用修改后的格式字符串插入io_lib:format函数调用(通过转换原始AST):

print_message(io_lib:format("My parameter value is ~p~n", [Param]))

结果我们可以归档所需的行为:

Bar = "hello",
Buzz = buzz123,    
?dump("Say $Bar to $Buzz"),
% => example:19: Say "hello" to buzz123

您可以查看我的实施here