erlang宏扩展错误

erlang macro expansion bug

macro 模块:

-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 -P macro.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.