gpt4 book ai didi

macros - 如何更改 "-define"Erlang 属性(宏定义)的值?

转载 作者:行者123 更新时间:2023-12-02 06:24:00 25 4
gpt4 key购买 nike

普通的 Erlang 属性可以通过解析转换来修改。这不适用于“-define”属性,因为它们由预处理器处理。如果您想更改所有宏的值而不更改文件本身,您会怎么做?

理想情况下,我想调用编译器的一些修改版本,这将具有以下效果:

当使用输入运行时...

...
-define(constant, 45).
-define(debug(X), io:format(X)).
...
?debug(?constant) % Line: 7
...

..和一个参数...

something:external

结果将是某种抽象形式,而不是......

{call,7,
{remote,7,{atom,7,io},{atom,7,format}},
[{integer,7,45}]}

...将会:

{call,7,
{remote,7,{atom,7,something},{atom,7,external}},
[{call,7,
{remote,7,{atom,7,something},{atom,7,external}},
[]}]}

当然,生成的代码可能无法执行,但可以对宏的使用进行一些“质量”分析。

最佳答案

普通编译器无法提供包含预处理器宏的语法树。正如您所注意到的,在将源代码提供给解析器之前,宏由预处理器扩展。

有一种方法可以获得伪解析树(erl_parse返回的普通解析树不能表示宏):使用模块 epp_dodger

epp_dodger - bypasses the Erlang preprocessor.

This module tokenises and parses most Erlang source code without expanding preprocessor directives and macro applications, as long as these are syntactically "well-behaved". Because the normal parse trees of the erl_parse module cannot represent these things (normally, they are expanded by the Erlang preprocessor epp(3) before the parser sees them), an extended syntax tree is created, using the erl_syntax module.

但是这不能集成到解析转换中。

但是您可以根据需要仔细阅读语法树,并将结果提供给编译器(如果需要)。只是为了推理解析树和 Erlang Syntax Tools 的代码这就是您所需要的。

关于macros - 如何更改 "-define"Erlang 属性(宏定义)的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7444239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com