Macros erlang宏扩展错误

Macros erlang宏扩展错误,macros,erlang,Macros,Erlang,宏模块: -module(macro). -include_lib("eunit/include/eunit.hrl"). -define(EXPAND(_T), ??_T). macro_test() -> ?assertEqual("Test", ?EXPAND(Test)), ?assertEqual("Test.test", ?EXPAND(Test.test)). 结果是: 6> c(macro). {ok,macro} 7>

模块:

-module(macro).

-include_lib("eunit/include/eunit.hrl").

-define(EXPAND(_T), ??_T).

macro_test() ->
    ?assertEqual("Test", ?EXPAND(Test)),
    ?assertEqual("Test.test", ?EXPAND(Test.test)).
结果是:

6> c(macro).         
{ok,macro}
7> eunit:test(macro).
macro: macro_test (module 'macro')...*failed*
in function macro:'-macro_test/0-fun-1-'/1 (macro.erl, line 9)
**error:{assertEqual_failed,[{module,macro},
                     {line,9},
                     {expression,"? EXPAND ( Test . test )"},
                     {expected,"Test.test"},
                     {value,"Test . test"}]}


=======================================================
  Failed: 1.  Skipped: 0.  Passed: 0.
error
我是做错了什么,还是这是一个已知的错误


TIA

您错误地认为Erlang编译器将
Test.Test
视为单个令牌。如果将
-P
选项传递到
erlc
并检查输出,您将看到预处理器将其分解为多个标记。下面是由
erlc-pmacro.erl
生成的
macro.P
的有趣部分:

macro_test() ->
    begin
        fun(__X) ->
               case "Test" of
                   __X ->
                       ok;
                   __V ->
                       error({assertEqual,
                              [{module,macro},
                               {line,8},
                               {expression,"? EXPAND ( Test )"},
                               {expected,__X},
                               {value,__V}]})
               end
        end("Test")
    end,
    begin
        fun(__X) ->
               case "Test . test" of
                   __X ->
                       ok;
                   __V ->
                       error({assertEqual,
                              [{module,macro},
                               {line,9},
                               {expression,"? EXPAND ( Test . test )"},
                               {expected,__X},
                               {value,__V}]})
               end
        end("Test.test")
    end.

“你应该多解释一下你想要完成什么。”史蒂维诺斯基我认为这是显而易见的。我正在尝试使用erlang macroYes的特性,这是显而易见的。但这不是你的最终目标,是吗?我真的想问你为什么需要将
Test.Test
精确地字符串化为
“Test.Test”
,也就是说,你最终想要完成什么?这就解释了!我还遗漏了添加空格的
io:format(“Call~s:~w~n”,“myfunction(1,2)”,myfunction(1,2)])
(在文档中)。所以宏参数是一种很好的语言