Compilation Erlang中编译期间的Eval表达式

Compilation Erlang中编译期间的Eval表达式,compilation,erlang,metaprogramming,constexpr,Compilation,Erlang,Metaprogramming,Constexpr,在Erlang中是否可能有某种等价的constexpr 我有一些表情 obj() -> func("some string") 其中func是一个纯函数(结果不依赖于参数以外的任何东西),我希望它在编译期间执行。我怎样才能做到呢 编辑我可以接受任何合理的攻击,只要它们允许func成为一个临时函数Erlang调用了一些东西,这些东西会在编译时展开。下面是一个您可以做的示例: a、 厄尔: -module(a). -compile(export_all). -define(FUNC(Str

在Erlang中是否可能有某种等价的
constexpr

我有一些表情

obj() -> func("some string")
其中
func
是一个纯函数(结果不依赖于参数以外的任何东西),我希望它在编译期间执行。我怎样才能做到呢

编辑我可以接受任何合理的攻击,只要它们允许
func
成为一个临时函数

Erlang调用了一些东西,这些东西会在编译时展开。下面是一个您可以做的示例:

a、 厄尔:

-module(a).
-compile(export_all).

-define(FUNC(Str), "hello "++Str).

go() ->
    ?FUNC("world").
在外壳中:

4> compile:file("a.erl", ['P']).

{ok,[]}

^C^C
在命令行中:

~/erlang_programs$ cat a.p
-file("a.erl", 1).

-module(a).

-compile(export_all).

go() ->
    "hello " ++ "world".
Erlang有一个名为的东西,它在编译时被扩展。下面是一个您可以做的示例:

a、 厄尔:

-module(a).
-compile(export_all).

-define(FUNC(Str), "hello "++Str).

go() ->
    ?FUNC("world").
在外壳中:

4> compile:file("a.erl", ['P']).

{ok,[]}

^C^C
在命令行中:

~/erlang_programs$ cat a.p
-file("a.erl", 1).

-module(a).

-compile(export_all).

go() ->
    "hello " ++ "world".
你可以使用,Ulf Wiger存储库的一部分。要使用它,请指定编译器应使用
ct\u expand
作为解析转换:

-compile({parse_transform, ct_expand}).
然后,对于要在编译时计算的每个表达式,将其包装在
ct\u expand:term/1

obj() -> ct_expand:term(func("some string")).
另请参见。

您可以使用,Ulf Wiger存储库的一部分。要使用它,请指定编译器应使用
ct\u expand
作为解析转换:

-compile({parse_transform, ct_expand}).
然后,对于要在编译时计算的每个表达式,将其包装在
ct\u expand:term/1

obj() -> ct_expand:term(func("some string")).

另请参见。

我看到您将FUNC定义为宏-在我的情况下FUNC需要是一个临时erlang函数我看到您将FUNC定义为一个宏-在我的情况下FUNC需要是一个临时erlang函数无法在编译时执行函数。但编译器可以识别函数定义中的文字,并提供一些优化。请参阅无法在编译时执行函数。但编译器可以识别函数定义中的文字,并提供一些优化。看见