【问题标题】:erlang macro expansion bugerlang宏扩展错误
【发布时间】:2015-09-08 13:31:53
【问题描述】:

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

【问题讨论】:

  • 您应该详细说明您要完成的工作。
  • @SteveVinoski 我认为这很明显。我正在尝试使用 erlang 宏的 Stringifying Macro Arguments 功能
  • 是的,这很明显。但这不是你的最终目标,不是吗?我真的想问为什么你需要将Test.test 精确地字符串化为"Test.test",即你最终想要完成什么?

标签: macros erlang


【解决方案1】:

您错误地假设 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.

【讨论】:

  • 这就解释了!我也错过了添加空间的io:format("Call ~s: ~w~n",["myfunction ( 1 , 2 )",myfunction(1,2)])(在文档中)。所以宏参数是一种漂亮的语言
猜你喜欢
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多